黑马程序员技术交流社区

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

作者: 茶念小手    时间: 2013-8-13 09:00
标题: 动态代理的一点问题
本帖最后由 茶念小手 于 2013-8-13 09:09 编辑
  1. public static void main(String[] args) {
  2.                 test test = new test();
  3.                
  4.                 test.list.add("a");
  5.         
  6.         }
  7.         Collection  list  = (Collection) Proxy.newProxyInstance(
  8.                                 Collection.class.getClassLoader(),
  9.                                 Collection.class.getInterfaces(),
  10.                                 
  11.                                  new InvocationHandler() {
  12.                                         ArrayList target =new ArrayList<>();
  13.                                         @Override
  14.                                         public Object invoke(Object arg0, Method arg1, Object[] arg2)
  15.                                                         throws Throwable {
  16.                                                 Object object = arg1.invoke(target, arg2);
  17.                                                 System.out.println("aaa");
  18.                                                 return object;
  19.                                         }
  20.                                 });
  21. }
复制代码
com.sun.proxy.$Proxy0 cannot be cast to java.util.Collection
错误说不能把这个代理转成Collection这个类型
代理不是实现了Collection.class.getInterfaces()这个接口吗  为什么不能转啊?
代码跟张老师的没啥子区别啊? 各位大神帮忙看看


作者: longlangcx    时间: 2013-8-13 09:43
错在Collection.class.getInterfaces()上了。

Collection本身就是一个接口,你直接Collection.class就行了。Collection.class.getInterfaces()返回的是此接口的父接口,而不返回其本身,因此你这里返回的是Iterable接口,你的代理相当于是对Iterable接口功能进行代理,你把父类强转为子类,自然是不行的。
作者: 心灵之歌    时间: 2013-8-13 10:23
public static void main(String[] args) {
                test test = new test();
               
                test.list.add("a");
        
        }
        Collection  list  = (Collection) Proxy.newProxyInstance(
                                Collection.class.getClassLoader(),
                                Collection.class,//变成代码就这样!
                                
                                 new InvocationHandler() {
                                        ArrayList target =new ArrayList<>();
                                        @Override
                                        public Object invoke(Object arg0, Method arg1, Object[] arg2)
                                                        throws Throwable {
                                                Object object = arg1.invoke(target, arg2);
                                                System.out.println("aaa");
                                                return object;
                                        }
                                });
}

作者: 茶念小手    时间: 2013-8-13 18:25
嗯嗯 知道了 谢谢各位




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