posts - 82, comments - 269, trackbacks - 0, articles - 1
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          動(dòng)態(tài)代理的一些思考和疑問(wèn):(疑問(wèn)還沒(méi)解決)
          在Java中有一個(gè)動(dòng)態(tài)代理技術(shù),主要通過(guò)Proxy,InvocationHandler和Method,這三個(gè)類(接口)來(lái)實(shí)現(xiàn).但是有如下一個(gè)問(wèn)題不太明白,希望高手解惑.

          我查看了幾個(gè)例子,它們實(shí)現(xiàn)InvocationHandler這個(gè)接口時(shí),都通過(guò)構(gòu)造函數(shù)傳遞進(jìn)去了,實(shí)際被代理的對(duì)象,然后在實(shí)現(xiàn)的方法中通過(guò)method.invoke(obj,args);obj為構(gòu)造函數(shù)傳遞進(jìn)來(lái)的對(duì)象.

          比如下面的例子:
          public class Handler implements InvocationHandler {

          ?MethodInterface delegate;

          ?public Handler(MethodInterface delegate) {
          ??this.delegate = delegate;
          ?}

          ?public Object invoke(Object proxy, Method method, Object[] args)
          ???throws Throwable {
          ??if (method.getName().equals("say")) {
          ???System.out.print("I have get it");
          ??}
          ??return method.invoke(this.delegate, args);?
          ?}

          }

          函數(shù)invoke()傳遞進(jìn)去的第一個(gè)參數(shù)proxy就沒(méi)有被使用到,但同樣實(shí)現(xiàn)了動(dòng)態(tài)代理的效果,后面參考文獻(xiàn)中的例子也是的,難道是這第一個(gè)參數(shù)就是多余的,如果是這樣的話,就是Sun設(shè)置失誤了 ^__^.

          sun的文檔是這樣解釋這個(gè)參數(shù)的:proxy - the proxy instance that the method was invoked on.但這個(gè)參數(shù)有什么用的,如果不傳遞他進(jìn)來(lái),會(huì)有什么不便呢.


          有沒(méi)有人能明白這是怎么回事,或者是寫(xiě)個(gè)示例代碼,講講這個(gè)第一個(gè)參數(shù)是干嘛用的?

          ?

          ?

          注:附兩個(gè)完整的動(dòng)態(tài)代理的例子
          http://blog.csdn.net/hsyj_0001/archive/2006/04/02/647488.aspx
          http://www.java2s.com/Code/Java/Development-Class/Demonstratesadynamicproxy.htm


          評(píng)論

          # re: 動(dòng)態(tài)代理的一些思考和疑問(wèn):(疑問(wèn)還沒(méi)解決)  回復(fù)  更多評(píng)論   

          2006-11-14 00:33 by kafka0102
          實(shí)際使用的代理對(duì)象應(yīng)該通過(guò)Proxy.newProxyInstance這樣的方法實(shí)現(xiàn),而代理對(duì)象調(diào)用的就是繼承了InvocationHandler的類的public Object invoke(Object proxy, Method method, Object[] args)方法,這里的Object proxy應(yīng)該就是代理對(duì)象本身。如果你的method.invoke(this.delegate, args); 改成method.invoke(proxy, args);將出現(xiàn)不斷的循環(huán)。


          # re: 動(dòng)態(tài)代理的一些思考和疑問(wèn):(疑問(wèn)還沒(méi)解決)  回復(fù)  更多評(píng)論   

          2006-11-14 09:39 by itspy
          @kafka0102

          樓上是高手!

          是的,是出現(xiàn)了不斷的循環(huán),這個(gè)我已經(jīng)測(cè)試過(guò)了,并且循環(huán)一定次數(shù)之后就出現(xiàn)了異常。

          如果是這樣的話,方法public Object invoke(Object proxy, Method method, Object[] args)

          傳遞進(jìn)來(lái)的proxy參數(shù)有什么用?難道是sun設(shè)計(jì)錯(cuò)了?

          # re: 動(dòng)態(tài)代理的一些思考和疑問(wèn):(疑問(wèn)還沒(méi)解決)  回復(fù)  更多評(píng)論   

          2006-11-14 11:03 by yubaojian0616
          你沒(méi)有明白動(dòng)態(tài)代理類的作用! 如果你返回 method.invoke(this.delegate, args); 他會(huì)繼續(xù)調(diào)用invoke方法 然后繼續(xù)返回 所以出現(xiàn)了死循環(huán)! 如果你沒(méi)有需要在代理的內(nèi)容應(yīng)該返回null,如果有就返回代理的對(duì)象

          # re: 動(dòng)態(tài)代理的一些思考和疑問(wèn):(疑問(wèn)還沒(méi)解決)  回復(fù)  更多評(píng)論   

          2006-11-14 11:19 by itspy
          @yubaojian0616
          謝謝你的回復(fù),你可能剛好弄反了

          method.invoke(proxy, args);這種方法會(huì)形成死循環(huán)


          method.invoke(this.delegate, args); 這種是正確的調(diào)用,文章最后有兩個(gè)參考引用,都是使用這種方式。


          對(duì)于這點(diǎn),你樓上的kafka0102就說(shuō)的很對(duì),你可能剛好說(shuō)反了,或者是你理解上和我一樣,有不明白的地方。不信你可以寫(xiě)測(cè)試程序去測(cè)試一下。或者是直接把引文里面的例子弄下來(lái)測(cè)試。



          # re: 動(dòng)態(tài)代理的一些思考和疑問(wèn):(疑問(wèn)還沒(méi)解決)  回復(fù)  更多評(píng)論   

          2012-08-21 21:47 by chaisencs
          你去看一下這個(gè)類RemoteObjectInvocationHandler的源代碼,就知道參數(shù)proxy其實(shí)是有用的
          主站蜘蛛池模板: 翼城县| 滕州市| 伊川县| 宁强县| 万山特区| 屏南县| 通州区| 丹巴县| 秦安县| 呼和浩特市| 同德县| 敦煌市| 达日县| 永昌县| 呼伦贝尔市| 儋州市| 百色市| 阳东县| 大田县| 镶黄旗| 乌兰县| 高密市| 饶阳县| 泸水县| 华容县| 准格尔旗| 芦山县| 杭州市| 美姑县| 冀州市| 南康市| 富川| 临朐县| 安宁市| 庆阳市| 鄂尔多斯市| 随州市| 北海市| 商河县| 建始县| 莱州市|