JDK动态代理需要一个invocation handler来处理方法的调用,该handler需要实现InvocationHandler接口。第一个参数代表代理实例,第二个是正在代理的方法,第三个是方法的参数。
package java.lang.reflect;
public interface InvocationHandler{
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}
假设有个接口,用来进行加减乘除:
public interface ICalc {
public int add(int a,int b);
public int minus(int a,int b);
public int times(int a,int b);
public int divide(int a,int b);
}
以及它的实现类:
public class CalcImp implements ICalc {
public int add(int a, int b) {
return a+b;
}
public int divide(int a, int b) {
if(b == 0){
throw new IllegalArgumentException();
}
return a/b;
}
public int minus(int a, int b) {
return a-b;
}
public int times(int a, int b) {
return a*b;
}
}
我们希望在计算器运算时进行一些额外的操作,比如日志等。可以通过实行InvocationHandler接口,编写一个记录方法起始和结束的调用处理程序。
public class CalcLogHandler implements InvocationHandler{
private Object target;
public CalcLogHandler(Object target) {
super();
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//方法执行前的操作
System.out.println("执行前");
Object result=method.invoke(target, args);
//方法执行后的操作
System.out.println("执行后");
return result;
}
}
测试:
public static void main(String[] args) {
ICalc calcImp=new CalcImp();
ICalc calc=(ICalc)Proxy.newProxyInstance(
calcImp.getClass().getClassLoader(),
calcImp.getClass().getInterfaces(),
new CalcLogHandler(calcImp));
calc.add(2, 3);
}