本帖最后由 周万谋 于 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呢?
|