1.使用动态代理添加日志
创建一个接口,一个实现类
接口
//总共加减乘除四个方法,要求为每一个方法添加日志
public interface Calculator {
public int add(int a,int b);
public int sub(int a,int b);
public int mul(int a,int b);
public int div(int a,int b);
}
实现类
public class CalculatorImpl implements Calculator {
@Override
public int add(int a, int b) {
return a+b;
}
@Override
public int sub(int a, int b) {
// TODO Auto-generated method stub
return a-b;
}
@Override
public int mul(int a, int b) {
// TODO Auto-generated method stub
return a*b;
}
@Override
public int div(int a, int b) {
// TODO Auto-generated method stub
return a/b;
}
}
日志类
public class Loginunit {
public static void before() {
System.out.println("执行前");
}
public static void afterRuning() {
System.out.println("执行中");
}
public static void afterThrowing() {
System.out.println("方法执行异常");
}
public static void after() {
System.out.println("执行完毕");
}
}
动态代理类:主要是返回一个Calculator接口的代理对象
public class Calculatorporxy {
public static Calculator getPorxy(Calculator calculator) {
/**
* loader:是目标对象的类加载器,就是被代理对象的类加载器
* interfaces:是目标对象实现的接口
* InvocationHandler:执行器,目标对象的方法执行器
*/
ClassLoader loader = calculator.getClass().getClassLoader();
Class<?>[] interfaces = calculator.getClass().getInterfaces();
InvocationHandler h = new InvocationHandler() {
/**
* proxy:给jdk使用的,任何时候都不要动
* method:被代理对象传入执行的方法
* args:传入的参数 此方法的返回值就是被调用对象调用的方法的返回值
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Loginunit.before();
// calculator就是被代理的对象
try {
Object result = method.invoke(calculator, args);
Loginunit.afterRuning();
return result;
} catch (Exception e) {
Loginunit.afterThrowing();
} finally {
Loginunit.after();
}
return null;
}
};
Calculator proxyCalculator = (Calculator) Proxy.newProxyInstance(loader, interfaces, h);
return proxyCalculator;
}
}
测试类
public class test {
public static void main(String[] args) {
//没有用动态代理的输出
Calculator calculator=new CalculatorImpl();
System.out.println("执行前");
System.out.println(calculator.add(1, 1));
System.out.println("执行后");
System.out.println("===================");
//使用动态代理
Calculator porxy=Calculatorporxy.getPorxy(calculator);
System.out.println(porxy.add(1, 1));
}
}