黑马程序员技术交流社区

标题: 代理问题,为什么死循环,我的理解不对吗? [打印本页]

作者: 张 涛    时间: 2012-9-14 12:24
标题: 代理问题,为什么死循环,我的理解不对吗?
本帖最后由 张 涛 于 2012-9-18 15:00 编辑
  1. Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
  2.                 Collection c = new LinkedList();
  3.                 Collection proxy2 = (Collection)Proxy.newProxyInstance(
  4.                         Collection.class.getClassLoader(),
  5.                         new Class[]{Collection.class},
  6.                         new InvocationHandler(){
  7.                                 public Object invoke(Object proxy, Method method, Object[] args)
  8.                                                 throws Throwable {
  9.                                         return method.invoke(proxy, args);
  10.                                 }
  11.                         }
  12.                 );
  13.                 proxy2.add("aaa");
  14.                 proxy2.add("bbb");
  15.                 System.out.println(proxy2.size());
复制代码
对于代理的InvocationHandler,我是这样理解的。比如proxy2.add(“aaa”),这个方法。调用他时,其内部是:
Class Proxy$ {
        add(Object object) {
return handler.invoke(Object proxy, Method method, Object[] args);
        }
}
所以是调用匿名内部类中的invoke方法,方法中传了三个参数,一个是调用方法的对象,第二个是方法,第三个是传入的参数。
正向应该是proxy.method(args).
这里是反射,所以应该是method.invoke(proxy, args).
这是我的理解,而实际证明是错的,因为我这样写,上面的代码会死循环。

问题1.我的理解哪里不对?
问题2.为什么死循环?
作者: 李菁    时间: 2012-9-14 12:36
01.Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);

02.                Collection c = new LinkedList();   你这句话是为动态类指定目标

03.                Collection proxy2 = (Collection)Proxy.newProxyInstance(

04.                        Collection.class.getClassLoader(),

05.                        new Class[]{Collection.class},

06.                        new InvocationHandler(){   匿名内部类,子类要实现接口中的方法

07.                                public Object invoke(Object proxy, Method method, Object[] args)  invoke方法只有Object proxy,Method method这两个参数

08.                                                throws Throwable {

09.                                        return method.invoke(proxy, args);  这个地方应该传入目标和参数

10.                                }

11.                        }

12.                );

13.                proxy2.add("aaa");

14.                proxy2.add("bbb");

15.                System.out.println(proxy2.size());


作者: 张 涛    时间: 2012-9-14 13:11
哦。明白了,写错了,那里应该是target,不再是proxy,再写proxy的话,就死循环了。谢谢了。




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