JAVA動態代理和CGLIB簡單介紹和使用

上一篇我們介紹了代理的一些基本概念和一個靜態代理的例子。

這一章我們先討論一下動態代理。

讓我們還延續上一章理財的例子。

上回書說到我把我的積蓄交給了理財經理之後,我就安心在家數錢就好了。

時間來到2015年,不知道朋友們有沒有見過千股跌停,很榮幸,筆者見過。

這時候趕緊把錢取出來,重新考慮理財方式。

從朋友處聽說基金的風險比較低。創建基金交易類,也實現理財接口,代碼實例如下

於是我又去找到理財經理,幫我買基金吧,但是理財經理犯難了,我沒有基金操作的經驗啊。那怎麼辦呢?難道我們換一個經理嗎?如果以後買期貨怎麼辦呢?再換一個嗎?要是有一個人能按照我的要求替我選好經理就好了。

這時候動態代理應運而生。Java提供了靜態方法Proxy.newInstance來創建動態代理,利用的是反射機制來完成。

上代碼,創建動態交易代理類。可以根據我們的需求動態的找到(創建)不同的經理。

可以看出,動態代理創建類的方法,代碼也是很少的。

下面我們就可以自由的切換理財模式了,只需要把要求告訴動態代理就可以了。

這樣做簡直太方便了。但是有一點需要注意,那就是JAVA提供的動態代理能創建的類是有一個條件的,那就是這個類必須實現了某一個接口。

如果我們要訪問的對象沒有實現某一個接口,又不能直接訪問,還想動態創建對象,怎麼辦呢?CGLIB可以幫我們解決。

CGLIB(Code Generation Library)是一個強大的,高性能,高質量的Code生成類庫,它可以在運行期擴展Java類與實現Java接口。

這也是CGLIB比JDK的代理類的強大之處,不只可以實現接口,還可以擴展類,解決了有的類由於沒有實現接口而無法被動態代理的問題。

另外,CGLIB底層封裝了ASM,通過對字節碼的操作來生成類,具有更高的性能。

這裏簡單介紹一下ASM。ASM是一套JAVA字節碼生成架構,能夠動態生成.class文件並在加載進內存之前進行修改,如果大家感興趣,以後單獨再寫一篇。

首先,使用CGLIB需要引用JAR包cglib-nodep-3.2.5.jar(如果引入cglib.jar,還需要引入asm的jar包)。

廢話不多說,讓我們看看使用CGLIB來完成本例中的動態代理來怎麼實現。

創建CGLIB動態代理類,Enhancer類來創建被代理的對象,intercept方法攔截所有的對象方法。

當然,這只是CGLIB應用的一部分,其實還爲我們提供了很多的功能,以後碰到的話再做一次詳細的分析,到這裏,代理就告一段落了。下一篇將會繼續更新深入理解JAVA虛擬機的筆記。

喜歡文章或想一起學習的朋友可以關注我,我將會持續更新,有什麼疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步。在收藏的同時能給我點個贊,感激不盡。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章