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