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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Yuan先生 中级黑马   /  2013-10-25 23:53  /  983 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本身就是ArrayList的代理类,但为什么不能用ArrayList
  1. //为什么用ArrayList会报$Proxy0 cannot be cast to java.util.ArrayList异常
  2. //                ArrayList<Object> arrayListProxy = (ArrayList<Object>)Proxy.newProxyInstance(
  3.                 List<Object> arrayListProxy = (List<Object>)Proxy.newProxyInstance(
  4.                         ArrayListProxy.class.getClassLoader(),
  5.                         new Class[]{Serializable.class,Cloneable.class,Iterable.class,Collection.class,List.class, RandomAccess.class},
  6.                         new InvocationHandler(){
  7.                                 ArrayList<Object> target = new ArrayList<Object>();
  8.                                 @Override
  9.                                 public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
  10.                                        
  11.                                         long before = System.currentTimeMillis();
  12. //                                        TimeUnit.SECONDS.sleep(1);
  13.                                         Object obj = method.invoke(target, args);
  14.                                         long after = System.currentTimeMillis();
  15.                                        
  16.                                         System.out.println("method ["+method.getName()+"] running time is :"+(after-before));
  17.                                         return obj;
  18.                                 }});
复制代码

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
客户端原来是直接调用target,现在客户端想直接调用proxy(因为代理扩展了target的功能),
proxy和target实现了共同的接口(dosomething),也就是说实现了dosomething接口的方法.
客户端调用程序的时候不是直接调用proxy,也不是直接调用target,而是直接引用接口,
这样客户端既可以使用target,又可以使用proxy。

JVM生成的动态类必须实现一个或多个接口,所以,JVM生成的动态类只能作用有相同接口的目标类的代理。

你的实现类对象包含了Serializable,Cloneable,Iterable,Collection,List, RandomAccess接口
JVM默认实现了这些接口,那么怎么可以用ArrayList来接收呢?
也就是说假如A类实现了Collection接口,ArrayList类也实现了Collection,那么你能用ArrayList类接收A类所创建的对象吗?
显然是不行的!

QQ截图20131027181536.png (62.91 KB, 下载次数: 15)

QQ截图20131027181536.png

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马