论坛首页 入门技术论坛

Java动态代理的设计是否有缺陷??

浏览 14610 次
该帖已经被评为新手帖
作者 正文
   发表时间:2010-04-25  
xyz20003 写道
呵呵~看来你没看懂我所说的问题呀。

你说的我绑定在一个接口上,说的正式一点儿应该是:我列举的场景stateful,而平常经常遇到的场景都是stateless,所以你会感到有些不适应。

至于你说的chain,似乎和咱们说的没什么关联,你先仔细考虑一下,思维不要跳的太快,先把我说的问题想明白。:)


确实,我对你的Stateful的场景,不太适应。谢谢你了,好心人啊。我在消化一下。

O(∩_∩)O~
0 请登录后投票
   发表时间:2010-09-21  
xiaolongfeixiang 写道
skzr.org 写道


public interface InvocationHandler{
    Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

此invoke将拦截所有代理的方法调用,包含了继承自Object的方法

 

1. 可以调用toString()和hashCode()方法的,需要自己在invoke中进行处理如:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

    if (method.getName().equals('toString')) {....}

    else if (method.getName().equals('hasCode')) {....}

}

实际上你任何执行此方法都是错误的:method.invoke(proxy, argus),注意这里的proxy本身就是代理,如果代理执行invoke,那么还是会被InvocationHandler.invoke拦截的,也就是任何method.invoke(proxy,argus)依然还是对InvocationHandler.invoke的调用,恭喜从此进入死循环了

 

2 代理可以是对真实存在的对象进行代理,

所以你需要方法setTarget(),更好的做法是在构造InvocationHandler时输入,如:

new MyInvocationHandler(target);

你可以使用

Object invoke(Object proxy, Method method, Object[] args) throws Throwable{

    if (method.getName().equals('toString') || method.getName().equals('hasCode')) {return method.inoke(target, args);}

}

3 代理也可以是一个虚幻的对象实例,只是这个实例的所有方法实现在InvocationHandler.invoke 中实现的

 

 

 

你说的很对,很受教导!谢谢!!

讲的很好。。思路一下打开了。

0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics