<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

    比如下面的例子:
    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)去的第一個參數(shù)proxy就沒有被使用到,但同樣實(shí)現(xiàn)了動態(tài)代理的效果,后面參考文獻(xiàn)中的例子也是的,難道是這第一個參數(shù)就是多余的,如果是這樣的話,就是Sun設(shè)置失誤了 ^__^.

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


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

    ?

    ?

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


    評論

    # re: 動態(tài)代理的一些思考和疑問:(疑問還沒解決)  回復(fù)  更多評論   

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


    # re: 動態(tài)代理的一些思考和疑問:(疑問還沒解決)  回復(fù)  更多評論   

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

    樓上是高手!

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

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

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

    # re: 動態(tài)代理的一些思考和疑問:(疑問還沒解決)  回復(fù)  更多評論   

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

    # re: 動態(tài)代理的一些思考和疑問:(疑問還沒解決)  回復(fù)  更多評論   

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

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


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


    對于這點(diǎn),你樓上的kafka0102就說的很對,你可能剛好說反了,或者是你理解上和我一樣,有不明白的地方。不信你可以寫測試程序去測試一下?;蛘呤侵苯影岩睦锩娴睦优聛頊y試。



    # re: 動態(tài)代理的一些思考和疑問:(疑問還沒解決)  回復(fù)  更多評論   

    2012-08-21 21:47 by chaisencs
    你去看一下這個類RemoteObjectInvocationHandler的源代碼,就知道參數(shù)proxy其實(shí)是有用的
    主站蜘蛛池模板: 国产亚洲福利一区二区免费看| 久久久久亚洲AV成人网| 亚洲专区先锋影音| 久久www免费人成精品香蕉| 亚洲成a人在线看天堂无码| 亚洲AⅤ男人的天堂在线观看 | 亚洲高清免费视频| 免费一级毛片在播放视频| 无码亚洲成a人在线观看| 国产三级电影免费观看| 特级毛片爽www免费版| 亚洲人妻av伦理| 97国免费在线视频| 亚洲AV美女一区二区三区| 99在线在线视频免费视频观看| 亚洲精品国产第1页| 成人女人A级毛片免费软件| 亚洲综合小说另类图片动图| 国产美女做a免费视频软件| 免费人成大片在线观看播放电影 | 久久精品a一国产成人免费网站| 学生妹亚洲一区二区| 国产jizzjizz视频免费看| 一级毛片免费全部播放| 亚洲五月激情综合图片区| 国产大片线上免费观看 | 一级片在线免费看| 国产AV无码专区亚洲AV毛网站| 91精品成人免费国产片| 亚洲精品宾馆在线精品酒店| 亚洲性日韩精品一区二区三区| 久久这里只精品国产免费10| 亚洲一区二区三区久久久久| 免费人妻av无码专区| 男人进去女人爽免费视频国产| 亚洲精品免费网站| 久久精品夜色噜噜亚洲A∨| 2019中文字幕在线电影免费 | 看成年女人免费午夜视频| 亚洲成AV人片一区二区| 成人免费777777|