Java學(xué)習(xí):Java動態(tài)代理(cglib)

上一篇關(guān)于java動態(tài)代理的jdk實現(xiàn)中,花了大量篇幅介紹了代理模式和靜態(tài)代理,最后講了jdk的動態(tài)代理實現(xiàn),也講到了jdk動態(tài)代理實現(xiàn)的一些約束:只能基于接口實現(xiàn)代理

關(guān)于jdk的動態(tài)代理實現(xiàn)可以參考:
Java動態(tài)代理(jdk)

但是我們實際的編碼中,大量的類都沒有實現(xiàn)任何接口,如何對這些類進(jìn)行代理呢?答案是cglib

  • cglib簡介:

CGLIB(Code Generation Library)是一個開源項目! 是一個強大的,高性能,高質(zhì)量的Code生成類庫,它可以在運行期擴(kuò)展Java類與實現(xiàn)Java接口 CGLIB底層是基于asm框架去實現(xiàn)字節(jié)碼的生成

  • cglib實現(xiàn)動態(tài)代理的步驟:

1、實現(xiàn)MethodInterceptor接口 2、通過Enhancer實現(xiàn)代理類的創(chuàng)建(生成一個繼承了客戶類的子類

  • 范例代碼:

實現(xiàn)MethodInterceptor接口的類:

public class Hacker implements MethodInterceptor {
    // 創(chuàng)建代理
    public Object getProxy(RealSubject subject)
    {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(subject.getClass());
        enhancer.setCallback(this);

        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

        System.out.println("before the method is invoked");

        // 這里調(diào)用的是invokeSuper而不是invoke
        methodProxy.invokeSuper(o, objects);

        System.out.println("after the method is invoked");

        return null;
    }
}

測試代碼:

public class TestMain {
    public static void main(String[] args) {
        RealSubject subject = new RealSubject();

        Hacker hacker = new Hacker();
        RealSubject proxy = (RealSubject) hacker.getProxy(subject);

        proxy.play();
    }
}

運行結(jié)果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,803評論 11 349
  • 代理模式 解說:給某一個對象提供一個代理,并由代理對象控制對原對象的引用; 代理模式需要以下幾個角色: 1 主題:...
    凌渡冰閱讀 412評論 0 1
  • 在工作之余看一些優(yōu)秀源碼的時候發(fā)現(xiàn)很多地方使用了動態(tài)代理,所以抽了一些時間對java的動態(tài)代理深入熟悉一下,這篇文...
    半支鉛筆半塊橡皮閱讀 567評論 0 3
  • 微涼的風(fēng) 從窗戶縫里滲透進(jìn)來 滴滴雨聲和著鋼琴的綿延傳進(jìn)神經(jīng)向上揚起的地方 無端的思緒徒然進(jìn)入到空無的境地 寫下幾...
    周子嵐閱讀 245評論 0 1
  • 調(diào)笑令(會寧初行) 洮水,洮水, 一杯云煙薈萃。 黃土劍指昆侖, 文章笑傲白銀。 銀白,銀白, 遠(yuǎn)上東山一脈。
    野渡ing閱讀 220評論 0 1

友情鏈接更多精彩內(nèi)容