昨天在编写ArrayList代理类的时候被一个问题搞得很头疼,下面的代码是获得一个对象的获取方法运行时间的代理类
- static Object getRuntimeProxy(Object obj){
-
- Object proxy = (Object)Proxy.newProxyInstance(
- obj.getClass().getClassLoader(),//获取对象的类加载器
- obj.getClass().getInterfaces(), //获取对象类型的接口列表
- new getRuntime(obj));//使用getRuntime代理功能
-
- return proxy;
- }
复制代码
对于这段代码,类型转换是安全的:
- List<Integer> proxy = (List<Integer>) getRuntimeProxy(new ArrayList());
复制代码
但是对于下面这种类型转换明显不安全的,Java却是必须等到运行期的时候才能发觉错误:
- List<Integer> proxy = (List<Integer>) getRuntimeProxy(new String());
复制代码
而对于下面这种看起来十分安全的类型转换,却是失败的,而且也是要等到运行期的时候才能发觉错误:
- List<Integer> proxy = (ArrayList<Integer>) getRuntimeProxy(new ArrayList());
复制代码
代理类是通过接口类型获得代理类的,因此被代理类必须是接口类型中的1种,且被代理类不能包含接口外的方法(这句话对吗?)。这样的话ArrayList()的代理类不能转换成ArrayList(),而可以转换为List类型就是容易理解的。
但是代理类的类型转换错误似乎都要等到运行期时才能发觉,这点对于编程不是很有利,产生这个问题是我的代码有问题,还是Java中代理类的一个缺陷?
对于ArrayList代理类不能转换成ArrayList类,以及类似的代理类只能转换成接口类型,Java似乎还有优化的空间,这点是我的学习未深入,理解不足,或者没有学习到解决方案,还是确实存在这样的问题?
|
|