動態(tài)代理

動態(tài)代理

動態(tài)代理類的源碼是在程序運行期間由JVM根據(jù)反射等機制動態(tài)的生成吸耿,所以不存在代理類的字節(jié)碼文件惑芭。代理類和委托類的關(guān)系是在程序運行時確定。

1淹遵、與動態(tài)代理緊密關(guān)聯(lián)的Java API口猜。

1)java.lang.reflect.Proxy

2)java.lang.reflect.InvocationHandler

3)java.lang.ClassLoader


2、動態(tài)代理的實現(xiàn)步驟

1)創(chuàng)建接口

public interface IDrink {
    void drink();
}

2)創(chuàng)建被代理類

public class Coffee implements IDrink {

    public void drink(){
        System.out.println("喝咖啡");
    }
}

3)創(chuàng)建代理工具類

public class MilkHandler implements InvocationHandler {

    Object obj = null;
    public MilkHandler(Object obj){
        this.obj = obj;
    }
    
    //proxy:被代理對象  method:需要被增強的方法   args:方法的參數(shù)
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("加牛奶");
        method.invoke(obj, args);
        return null;
    }
}

4)測試

Coffee c = new Coffee();
MilkHandler h = new MilkHandler(c);
IDrink d= (IDrink) Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass().getInterfaces(), h);
d.drink();


動態(tài)代理機制的特點

首先是動態(tài)生成的代理類本身的一些特點透揣。

  • 包:如果所代理的接口都是 public 的济炎,那么它將被定義在頂層包(即包路徑為空),如果所代理的接口中有非 public 的接口(因為接口不能被定義為 protect 或 private辐真,所以除 public 之外就是默認的 package 訪問級別)冻辩,那么它將被定義在該接口所在包(假設(shè)代理了 com.ibm.developerworks 包中的某非 public 接口 A,那么新生成的代理類所在的包就是 com.ibm.developerworks)拆祈,這樣設(shè)計的目的是為了最大程度的保證動態(tài)代理類不會因為包管理的問題而無法被成功定義并訪問

  • 類修飾符:該代理類具有 final 和 public 修飾符恨闪,意味著它可以被所有的類訪問,但是不能被再度繼承放坏;

  • 類名:格式是“$ProxyN”咙咽,其中 N 是一個逐一遞增的阿拉伯?dāng)?shù)字,代表 Proxy 類第 N 次生成的動態(tài)代理類淤年,值得注意的一點是钧敞,并不是每次調(diào)用 Proxy 的靜態(tài)方法創(chuàng)建動態(tài)代理類都會使得 N 值增加,原因是如果對同一組接口(包括接口排列的順序相同)試圖重復(fù)創(chuàng)建動態(tài)代理類麸粮,它會很聰明地返回先前已經(jīng)創(chuàng)建好的代理類的類對象溉苛,而不會再嘗試去創(chuàng)建一個全新的代理類,這樣可以節(jié)省不必要的代碼重復(fù)生成弄诲,提高了代理類的創(chuàng)建效率愚战。


動態(tài)代理的優(yōu)缺點

優(yōu)點

動態(tài)代理與靜態(tài)代理相比較,最大的好處是接口中聲明的所有方法都被轉(zhuǎn)移到調(diào)用處理器一個集中的方法中處理(InvocationHandler.invoke)齐遵。這樣寂玲,在接口方法數(shù)量比較多的時候,我們可以進行靈活處理梗摇,而不需要像靜態(tài)代理那樣每一個方法進行中轉(zhuǎn)拓哟。在本示例中看不出來,因為invoke方法體內(nèi)嵌入了具體的外圍業(yè)務(wù)(記錄任務(wù)處理前后時間并計算時間差)伶授,實際中可以類似Spring AOP那樣配置外圍業(yè)務(wù)断序。

缺點

誠然流纹,Proxy 已經(jīng)設(shè)計得非常優(yōu)美,但是還是有一點點小小的遺憾之處违诗,那就是它始終無法擺脫僅支持 interface 代理的桎梏捧颅,因為它的設(shè)計注定了這個遺憾〗系瘢回想一下那些動態(tài)生成的代理類的繼承關(guān)系圖碉哑,它們已經(jīng)注定有一個共同的父類叫 Proxy。Java 的繼承機制注定了這些動態(tài)代理類們無法實現(xiàn)對 class 的動態(tài)代理亮蒋,原因是多繼承在 Java 中本質(zhì)上就行不通扣典。

有很多條理由,人們可以否定對 class 代理的必要性慎玖,但是同樣有一些理由贮尖,相信支持 class 動態(tài)代理會更美好。接口和類的劃分趁怔,本就不是很明顯湿硝,只是到了 Java 中才變得如此的細化。如果只從方法的聲明及是否被定義來考量润努,有一種兩者的混合體关斜,它的名字叫抽象類。實現(xiàn)對抽象類的動態(tài)代理铺浇,相信也有其內(nèi)在的價值痢畜。此外,還有一些歷史遺留的類鳍侣,它們將因為沒有實現(xiàn)任何接口而從此與動態(tài)代理永世無緣丁稀。如此種種,不得不說是一個小小的遺憾倚聚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末线衫,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惑折,更是在濱河造成了極大的恐慌授账,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唬复,死亡現(xiàn)場離奇詭異矗积,居然都是意外死亡,警方通過查閱死者的電腦和手機敞咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辜腺,“玉大人休建,你說我怎么就攤上這事乍恐。” “怎么了测砂?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵茵烈,是天一觀的道長。 經(jīng)常有香客問我砌些,道長呜投,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任存璃,我火速辦了婚禮仑荐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纵东。我一直安慰自己粘招,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布偎球。 她就那樣靜靜地躺著洒扎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衰絮。 梳的紋絲不亂的頭發(fā)上袍冷,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音猫牡,去河邊找鬼难裆。 笑死,一個胖子當(dāng)著我的面吹牛镊掖,可吹牛的內(nèi)容都是我干的乃戈。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼亩进,長吁一口氣:“原來是場噩夢啊……” “哼症虑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起归薛,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谍憔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后主籍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體习贫,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年千元,在試婚紗的時候發(fā)現(xiàn)自己被綠了苫昌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡幸海,死狀恐怖祟身,靈堂內(nèi)的尸體忽然破棺而出奥务,到底是詐尸還是另有隱情,我是刑警寧澤袜硫,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布氯葬,位于F島的核電站,受9級特大地震影響婉陷,放射性物質(zhì)發(fā)生泄漏帚称。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一秽澳、第九天 我趴在偏房一處隱蔽的房頂上張望闯睹。 院中可真熱鬧,春花似錦肝集、人聲如沸瞻坝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽所刀。三九已至,卻和暖如春捞挥,著一層夾襖步出監(jiān)牢的瞬間浮创,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工砌函, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留斩披,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓讹俊,卻偏偏與公主長得像垦沉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仍劈,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容