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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 屈_zi 中级黑马   /  2014-5-20 15:03  /  834 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

昨天在编写ArrayList代理类的时候被一个问题搞得很头疼,下面的代码是获得一个对象的获取方法运行时间的代理类
  1.         static Object getRuntimeProxy(Object obj){
  2.                
  3.                 Object proxy = (Object)Proxy.newProxyInstance(
  4.                                 obj.getClass().getClassLoader(),//获取对象的类加载器
  5.                                 obj.getClass().getInterfaces(), //获取对象类型的接口列表
  6.                                 new getRuntime(obj));//使用getRuntime代理功能
  7.                
  8.                 return proxy;
  9.         }
复制代码


对于这段代码,类型转换是安全的:

  1. List<Integer> proxy = (List<Integer>) getRuntimeProxy(new ArrayList());
复制代码


但是对于下面这种类型转换明显不安全的,Java却是必须等到运行期的时候才能发觉错误:

  1. List<Integer> proxy = (List<Integer>) getRuntimeProxy(new String());
复制代码


而对于下面这种看起来十分安全的类型转换,却是失败的,而且也是要等到运行期的时候才能发觉错误:

  1. List<Integer> proxy = (ArrayList<Integer>) getRuntimeProxy(new ArrayList());
复制代码


代理类是通过接口类型获得代理类的,因此被代理类必须是接口类型中的1种,且被代理类不能包含接口外的方法(这句话对吗?)。这样的话ArrayList()的代理类不能转换成ArrayList(),而可以转换为List类型就是容易理解的。



但是代理类的类型转换错误似乎都要等到运行期时才能发觉,这点对于编程不是很有利,产生这个问题是我的代码有问题,还是Java中代理类的一个缺陷


对于ArrayList代理类不能转换成ArrayList类,以及类似的代理类只能转换成接口类型,Java似乎还有优化的空间,这点是我的学习未深入,理解不足,或者没有学习到解决方案,还是确实存在这样的问题?





2 个回复

倒序浏览
没有人回答么
回复 使用道具 举报
来看看,学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马