上一篇我們介紹了代理的一些基本概念和一個靜態代理的例子。
這一章我們先討論一下動態代理。
讓我們還延續上一章理財的例子。
上回書說到我把我的積蓄交給了理財經理之後,我就安心在家數錢就好了。
時間來到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虛擬機的筆記。
喜歡文章或想一起學習的朋友可以關注我,我將會持續更新,有什麼疑問或文中有不當之處請給我留言,真誠地希望能與大家一起交流探討,學習進步。在收藏的同時能給我點個贊,感激不盡。