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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 茶念小手 中级黑马   /  2013-8-13 09:00  /  1355 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 茶念小手 于 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()这个接口吗  为什么不能转啊?
代码跟张老师的没啥子区别啊? 各位大神帮忙看看

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

3 个回复

倒序浏览
错在Collection.class.getInterfaces()上了。

Collection本身就是一个接口,你直接Collection.class就行了。Collection.class.getInterfaces()返回的是此接口的父接口,而不返回其本身,因此你这里返回的是Iterable接口,你的代理相当于是对Iterable接口功能进行代理,你把父类强转为子类,自然是不行的。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
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;
                                        }
                                });
}

评分

参与人数 1技术分 +1 收起 理由
张智文 + 1

查看全部评分

回复 使用道具 举报
嗯嗯 知道了 谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马