黑马程序员技术交流社区
标题:
关于代理Proxy
[打印本页]
作者:
Yuan先生
时间:
2013-10-25 23:53
标题:
关于代理Proxy
本身就是ArrayList的代理类,但为什么不能用ArrayList
//为什么用ArrayList会报$Proxy0 cannot be cast to java.util.ArrayList异常
// ArrayList<Object> arrayListProxy = (ArrayList<Object>)Proxy.newProxyInstance(
List<Object> arrayListProxy = (List<Object>)Proxy.newProxyInstance(
ArrayListProxy.class.getClassLoader(),
new Class[]{Serializable.class,Cloneable.class,Iterable.class,Collection.class,List.class, RandomAccess.class},
new InvocationHandler(){
ArrayList<Object> target = new ArrayList<Object>();
@Override
public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {
long before = System.currentTimeMillis();
// TimeUnit.SECONDS.sleep(1);
Object obj = method.invoke(target, args);
long after = System.currentTimeMillis();
System.out.println("method ["+method.getName()+"] running time is :"+(after-before));
return obj;
}});
复制代码
作者:
Cheers_for_CRAZ
时间:
2013-10-27 18:54
客户端原来是直接调用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, 下载次数: 17)
下载附件
2013-10-27 18:52 上传
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2