黑马程序员技术交流社区
标题:
代理问题,为什么死循环,我的理解不对吗?
[打印本页]
作者:
张 涛
时间:
2012-9-14 12:24
标题:
代理问题,为什么死循环,我的理解不对吗?
本帖最后由 张 涛 于 2012-9-18 15:00 编辑
Class clazzProxy = Proxy.getProxyClass(Collection.class.getClassLoader(), Collection.class);
Collection c = new LinkedList();
Collection proxy2 = (Collection)Proxy.newProxyInstance(
Collection.class.getClassLoader(),
new Class[]{Collection.class},
new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
return method.invoke(proxy, args);
}
}
);
proxy2.add("aaa");
proxy2.add("bbb");
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