黑马程序员技术交流社区
标题:
代理类的内部代码分析
[打印本页]
作者:
周万谋
时间:
2012-10-27 13:08
标题:
代理类的内部代码分析
本帖最后由 周万谋 于 2012-10-28 15:12 编辑
今天复习代理类的时候,温习了怎么创建代理,它的内部实现也算是细节中的细节,在这里想跟大家分享一下(加强理解),分析得不好,欢迎童鞋们指正
Collection proxy3 = (Collection)Proxy.newProxyInstance( //创建动态代理的最简形式,以下代码一执行就是创建一个代理了
Collection.class.getClassLoader(), //指定对象的加载器
new Class[]{Collection.class}, // 指定对象的字节码
new InvocationHandler(){ //InvocationHandler的子类对象
ArrayList<String> <FONT color=red>target</FONT> = new ArrayList<String>();
@Override
public Object invoke(Object <FONT color=red>proxy</FONT>, Method <FONT color=red>method</FONT>,Object[] <FONT color=red>args</FONT>) throws Throwable {
// proxy是调用代理的对象,例如 proxy3
// method是代理对象调用的某个方法,例如 add()
// args是方法的参数 add 方法的参数
long start = System.currentTimeMillis();
Object retVal = method.invoke(<FONT color=red>target</FONT>, args);//在目标上(目标是ArrayList<String>泛型集合)执行代理,这个invoke方法和反射方法中的invoke原理类似
long end = System.currentTimeMillis();
System.out.println(method.getName()+"--method run--"+(end-start));
return retVal;
}
}
);
proxy3.add("zxx"); //通过代理对象proxy3的add方法向ArrayList<String>添加数据
proxy3.add("lhm"); //add方法返回的类型和InvocationHandler子类的invoke方法返回类型一致,都是Object
proxy3.add("bxd");
proxy3.add("h m"); //通过测试的结果可以得到:代理对象proxy3调用add方法,代理对象会自动去找它的InvocationHandler子类的invoke方法
System.out.println(proxy3.size()); //调用size方法时,代理对象也会自动去找它的InvocationHandler子类的invoke方法
//综上所述,个人觉得掌握代理需要注意的是:要操作对象和目标;只要明确了要操作的对象,就可以搞定前两个参数;再明确一个目标,就可以将代理和要操作的数据联系起来。
复制代码
分析完,我有个小小的疑问:代理调用的所有方法是不是都会去找invoke呢?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2