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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-小龙 中级黑马   /  2013-1-29 00:22  /  965 人查看  /  1 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Fanshe1 {
  2.         public static void main(String[] args) throws InstantiationException,
  3.                         IllegalAccessException {
  4.                 ArrayList taget = new ArrayList();
  5.                 Collection proxy4 = (Collection) getProxy(taget, new Advice());
  6.                 proxy4.add("cxl");
  7.                 proxy4.add("zzz");
  8.                 System.out.println(proxy4.size());
  9.                 // 结果打印三对方法,是因为,集合每使用一次proxy4对象的时候都从进入InvocationHandler对象一次
  10.         }

  11.         public static Object getProxy(final ArrayList taget, final Advice advice)
  12.                         throws InstantiationException, IllegalAccessException {
  13.                 // 先获取该类的字节码文件,再获取该类的类加载器
  14.                 // 然后获取接口的字节码文件
  15.                 // 最后调用处理的程序,通过InvocationHandler
  16.                 Object className = Proxy.newProxyInstance(taget.getClass()
  17.                                 .getClassLoader(), taget.getClass().getInterfaces(),
  18.                                 new InvocationHandler() {

  19.                                         @Override
  20.                                         // 传入代理对象、对象的方法、对象的参数
  21.                                         public Object invoke(Object proxy, Method method,
  22.                                                         Object[] args) throws Throwable {
  23.                                                 // 放入代理对象方法的上面和下面
  24.                                                 advice.look();
  25.                                                 // invoke.使用taget的对象的args方法
  26.                                                 Object result = method.invoke(taget, args);
  27.                                                 advice.show();
  28.                                                 return result;
  29.                                         }
  30.                                 });
  31.                 return className;

  32.         }
  33. }
复制代码
有点不明白,张老师说的,invoke方法,客户端的调用代理,使用方法的时候,每使用一次都会调用invoke方法是什么意思?

1 个回复

倒序浏览
这个有点绕。就是客户端调用代理对象proxy的方法,方法名为 add,那么在add方法中其实调用了InvocationHandler的invoke方法,在invoke方法内部,调用了target目标类的add方法

proxy.PNG (22.04 KB, 下载次数: 21)

proxy.PNG
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马