動態(tài)代理

Jdk 動態(tài)代理

Jdk動態(tài)代理薯鳍,利用反射挪鹏,實現(xiàn) InvocationHandler 接口。Jdk 動態(tài)代理需要實現(xiàn)類通過接口定義業(yè)務方法郁副,也就是說,委托類必須實現(xiàn)一個定義了業(yè)務方法的接口豌习,在接口里約定需要代理的方法存谎,并且只能對接口里約定的方法實現(xiàn)代理。由于需要委托類實現(xiàn)一個接口斑鸦,這是一個局限性愕贡。

Jdk 代理類圖
  • Subject 類
public interface Subject {
    void doSomething();
}
  • RealSubject 類
public class RealSubject implements Subject {
    @Override
    public void doSomething() {
        System.out.println("do something");
    }
}
  • Jdk 代理
public class JdkProxy implements InvocationHandler {
    private Object target;

    public JdkProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result;
        System.out.println("jdk proxy before");
        result = method.invoke(target, args);
        System.out.println("jdk proxy after");
        return result;
    }
}
  • Jdk 代理測試
public class JdkProxyTest {
    @Test
    public void testJdkProxy() {
        RealSubject realSubject = new RealSubject();
        Subject subject = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new JdkProxy(realSubject));
        subject.doSomething();
    }
}

運行結(jié)果:
jdk proxy before
do something
jdk proxy after

Cglib 動態(tài)代理

Cglib 代理是針對類來實現(xiàn)代理的,并不要求委托類必須實現(xiàn)接口巷屿,它的原理是對指定的目標類生成一個子類固以,并覆蓋其中方法實現(xiàn)增強,采用的是繼承的方式嘱巾。由于是采用繼承的方式憨琳,所以用 Cglib 實現(xiàn)的代理類是不能處理被final關鍵字修飾的方法的。

Cglib 代理類圖
  • Cglib 代理
public class CglibProxy implements MethodInterceptor {
    public Object getInstance(Class clazz) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        Object result;
        System.out.println("cglib proxy before");
        result = methodProxy.invokeSuper(o, objects);
        System.out.println("cglib proxy after");
        return result;
    }
}

在上文中可以看到旬昭,代理對象的生成過程是由 Enhancer 類來實現(xiàn)的篙螟,大概步驟是:

  1. 生成代理類 Class 的二進制字節(jié)碼;
  2. 通過 Class.forName 加載二進制字節(jié)碼问拘,生成Class對象遍略;
  3. 通過反射機制獲取實例構(gòu)造惧所,并初始化代理類對象。

intercept() 方法攔截目標類方法的調(diào)用绪杏,o 表示目標類的實例下愈,method 為目標類方法的反射對象,objects 為方法的動態(tài)入?yún)⒗倬茫琺ethodProxy 為代理類實例势似。

  • Cglib 代理測試
public class CglibProxyTest {
    @Test
    public void testCglibProxy() {
        RealSubject realSubject = (RealSubject) new CglibProxy().getInstance(RealSubject.class);
        realSubject.doSomething();
    }
}

運行結(jié)果:
cglib proxy before
do something
cglib proxy after

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市僧著,隨后出現(xiàn)的幾起案子履因,更是在濱河造成了極大的恐慌,老刑警劉巖盹愚,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栅迄,死亡現(xiàn)場離奇詭異,居然都是意外死亡杯拐,警方通過查閱死者的電腦和手機霞篡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來端逼,“玉大人,你說我怎么就攤上這事污淋《ヌ玻” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵寸爆,是天一觀的道長礁鲁。 經(jīng)常有香客問我,道長赁豆,這世上最難降的妖魔是什么仅醇? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮魔种,結(jié)果婚禮上析二,老公的妹妹穿的比我還像新娘。我一直安慰自己节预,他們只是感情好叶摄,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著安拟,像睡著了一般蛤吓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠赦,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天会傲,我揣著相機與錄音锅棕,去河邊找鬼。 笑死淌山,一個胖子當著我的面吹牛裸燎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艾岂,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼顺少,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了王浴?” 一聲冷哼從身側(cè)響起脆炎,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氓辣,沒想到半個月后秒裕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡钞啸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年几蜻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片体斩。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡梭稚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出絮吵,到底是詐尸還是另有隱情弧烤,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布蹬敲,位于F島的核電站暇昂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伴嗡。R本人自食惡果不足惜急波,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘪校。 院中可真熱鬧澄暮,春花似錦、人聲如沸渣淤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽价认。三九已至嗅定,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間用踩,已是汗流浹背渠退。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工忙迁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人碎乃。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓姊扔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梅誓。 傳聞我的和親對象是個殘疾皇子恰梢,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361

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