A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周万谋 中级黑马   /  2012-10-27 13:08  /  883 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周万谋 于 2012-10-28 15:12 编辑

今天复习代理类的时候,温习了怎么创建代理,它的内部实现也算是细节中的细节,在这里想跟大家分享一下(加强理解),分析得不好,欢迎童鞋们指正
  1. Collection proxy3 = (Collection)Proxy.newProxyInstance( //创建动态代理的最简形式,以下代码一执行就是创建一个代理了
  2.         Collection.class.getClassLoader(),  //指定对象的加载器
  3.         new Class[]{Collection.class},   // 指定对象的字节码
  4.         new InvocationHandler(){  //InvocationHandler的子类对象
  5.             ArrayList<String> <FONT color=red>target</FONT> = new ArrayList<String>();
  6.            @Override
  7.            public Object invoke(Object <FONT color=red>proxy</FONT>, Method <FONT color=red>method</FONT>,Object[] <FONT color=red>args</FONT>) throws Throwable {
  8.                    // proxy是调用代理的对象,例如 proxy3
  9.                   // method是代理对象调用的某个方法,例如 add()
  10.                  // args是方法的参数 add 方法的参数
  11.                      long start = System.currentTimeMillis();

  12.                     Object retVal = method.invoke(<FONT color=red>target</FONT>, args);//在目标上(目标是ArrayList<String>泛型集合)执行代理,这个invoke方法和反射方法中的invoke原理类似

  13.                     long end = System.currentTimeMillis();
  14.                     System.out.println(method.getName()+"--method run--"+(end-start));
  15.                     return retVal;

  16.           }
  17.      }
  18. );
  19. proxy3.add("zxx");     //通过代理对象proxy3的add方法向ArrayList<String>添加数据
  20. proxy3.add("lhm");    //add方法返回的类型和InvocationHandler子类的invoke方法返回类型一致,都是Object
  21. proxy3.add("bxd");   
  22. proxy3.add("h m");   //通过测试的结果可以得到:代理对象proxy3调用add方法,代理对象会自动去找它的InvocationHandler子类的invoke方法
  23. System.out.println(proxy3.size()); //调用size方法时,代理对象也会自动去找它的InvocationHandler子类的invoke方法
  24. //综上所述,个人觉得掌握代理需要注意的是:要操作对象和目标;只要明确了要操作的对象,就可以搞定前两个参数;再明确一个目标,就可以将代理和要操作的数据联系起来。
复制代码
分析完,我有个小小的疑问:代理调用的所有方法是不是都会去找invoke呢?

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 很给力!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马