黑马程序员技术交流社区

标题: 动态代理问题 [打印本页]

作者: 黑马-小龙    时间: 2013-1-29 00:22
标题: 动态代理问题
  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方法是什么意思?

作者: 黄锦成    时间: 2013-1-29 10:11
这个有点绕。就是客户端调用代理对象proxy的方法,方法名为 add,那么在add方法中其实调用了InvocationHandler的invoke方法,在invoke方法内部,调用了target目标类的add方法

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

proxy.PNG





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2