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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 张 涛 于 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.为什么死循环?

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
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());

评分

参与人数 1技术分 +1 收起 理由
王德升 + 1 赞一个!

查看全部评分

回复 使用道具 举报
哦。明白了,写错了,那里应该是target,不再是proxy,再写proxy的话,就死循环了。谢谢了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马