「必知必會」Android 中的動態(tài)代理

Android 中的動態(tài)代理

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

  • 隱藏委托類的實現(xiàn)
  • 解耦壶唤,不改變委托類代碼情況下做一些額外處理
  • 方便對代理類的函數(shù)做統(tǒng)一或特殊處理
實現(xiàn)步驟
  • 新建接口類

    public interface Subject   
    {   
      public void doSomething();   
    }               
    
  • 創(chuàng)建委托類并實現(xiàn)定義的接口類

    public class RealSubject implements Subject   
    {   
      public void doSomething()   
      {   
        System.out.println( "call doSomething()" );   
      }   
    }
    
  • 創(chuàng)建代理幫助類,實現(xiàn)InvocationHandler接口

    InvocationHandler:是負(fù)責(zé)連接代理類和委托類的中間類必須實現(xiàn)的接口

    import java.lang.reflect.InvocationHandler;  
    import java.lang.reflect.Method;  
    import java.lang.reflect.Proxy;  
    
    public class ProxyHandler implements InvocationHandler
    {
        private Object tar;
    
        //綁定委托對象晚凿,并返回代理類
        public Object bind(Object tar)
        {
              //tar屬性表示委托類對象梆暖。
            this.tar = tar;
          
            //綁定該類實現(xiàn)的所有接口,取得代理類 
            return Proxy.newProxyInstance(
              //loader表示類加載器
              tar.getClass().getClassLoader(),
              //interfaces表示委托類的接口,生成代理類時需要實現(xiàn)這些接口
              tar.getClass().getInterfaces(),
              //InvocationHandler實現(xiàn)類對象响蕴,負(fù)責(zé)連接代理類和委托類的中間類
              this);
        }    
      //當(dāng)proxy生成字節(jié)碼時 會調(diào)用invoke方法 
        public Object invoke(Object proxy , Method method , Object[] args)throws Throwable
        {
            Object result = null;
            //這里就可以進(jìn)行所謂的AOP編程了
            //在調(diào)用具體函數(shù)方法前,執(zhí)行功能處理
            result = method.invoke(tar,args);
            //在調(diào)用具體函數(shù)方法后惠桃,執(zhí)行功能處理
            return result;
        }
    }
    
  • public class TestProxy
    {
        public static void main(String args[])
        {
               ProxyHandler proxy = new ProxyHandler();
               //綁定該類實現(xiàn)的所有接口
               Subject sub = (Subject) proxy.bind(new RealSubject());
                  //調(diào)用代理對象的每個函數(shù)實際最終都是調(diào)用了InvocationHandler的invoke函數(shù)浦夷。
               sub.doSomething();
        }
    }
    
原理

動態(tài)代理可以理解為雙向靜態(tài)代理,我們先是創(chuàng)建委托類B辜王,系統(tǒng)動態(tài)生成代理類A劈狐。

然后創(chuàng)建一個實現(xiàn)了InvocationHandler的子類C,子類連接代理類A和委托類B呐馆。

它是代理類A的委托類肥缔,是委托類B的代理類。

用戶直接調(diào)用代理類A的對象汹来,A將調(diào)用轉(zhuǎn)給它的委托類C续膳,委托類C再將調(diào)用轉(zhuǎn)發(fā)給它的委托類B改艇。

用到的地方
  • jfinal框架中的攔截器機(jī)制就是基于動態(tài)代理實現(xiàn)的。
    • 使用 cglib 動態(tài)代理
    • 將InvocationHandler抽象為一個Invocation坟岔,在invoke方法中實現(xiàn)調(diào)用委托類方法之前對本次請求進(jìn)行攔截谒兄。
  • Retrofit:簡化了網(wǎng)絡(luò)請求

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市社付,隨后出現(xiàn)的幾起案子舵变,更是在濱河造成了極大的恐慌,老刑警劉巖瘦穆,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纪隙,死亡現(xiàn)場離奇詭異,居然都是意外死亡扛或,警方通過查閱死者的電腦和手機(jī)绵咱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熙兔,“玉大人悲伶,你說我怎么就攤上這事∽∩妫” “怎么了麸锉?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長舆声。 經(jīng)常有香客問我花沉,道長,這世上最難降的妖魔是什么媳握? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任碱屁,我火速辦了婚禮,結(jié)果婚禮上蛾找,老公的妹妹穿的比我還像新娘娩脾。我一直安慰自己,他們只是感情好打毛,可當(dāng)我...
    茶點故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布柿赊。 她就那樣靜靜地躺著,像睡著了一般幻枉。 火紅的嫁衣襯著肌膚如雪碰声。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天展辞,我揣著相機(jī)與錄音奥邮,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛洽腺,可吹牛的內(nèi)容都是我干的脚粟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蘸朋,長吁一口氣:“原來是場噩夢啊……” “哼核无!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起藕坯,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤团南,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炼彪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吐根,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年辐马,在試婚紗的時候發(fā)現(xiàn)自己被綠了拷橘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,488評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡喜爷,死狀恐怖冗疮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檩帐,我是刑警寧澤术幔,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站湃密,受9級特大地震影響诅挑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜勾缭,卻給世界環(huán)境...
    茶點故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一揍障、第九天 我趴在偏房一處隱蔽的房頂上張望目养。 院中可真熱鬧俩由,春花似錦、人聲如沸癌蚁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽努释。三九已至碘梢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伐蒂,已是汗流浹背煞躬。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恩沛。 一個月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓在扰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雷客。 傳聞我的和親對象是個殘疾皇子芒珠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,500評論 2 359

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