您的位置:首页 > 移动开发 > Objective-C

动态代理

2015-10-23 00:00 513 查看
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);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息