java基礎篇--動態代理是如何實現的?JDK Proxy 和 CGLib 有什麼區別?

90% 的程序員直接或者間接的使用過動態代理,無論是日誌框架或 Spring 框架,它們都包含了動態代理的實現代碼。動態代理是程序在運行期間動態構建代理對象和動態調用代理方法的一種機制。

我們本課時的面試題是,如何實現動態代理?JDK Proxy 和 CGLib 有什麼區別?

典型回答

動態代理的常用實現方式是反射。反射機制是指程序在運行期間可以訪問、檢測和修改其本身狀態或行爲的一種能力,使用反射我們可以調用任意一個類對象,以及類對象中包含的屬性及方法。

但動態代理不止有反射一種實現方式,例如,動態代理可以通過 CGLib 來實現,而 CGLib 是基於 ASM(一個 Java 字節碼操作框架)而非反射實現的。簡單來說,動態代理是一種行爲方式,而反射或 ASM 只是它的一種實現手段而已。

JDK Proxy 和 CGLib 的區別主要體現在以下幾個方面:

    JDK Proxy 是 Java 語言自帶的功能,無需通過加載第三方類實現;
    Java 對 JDK Proxy 提供了穩定的支持,並且會持續的升級和更新 JDK Proxy,例如 Java 8 版本中的 JDK Proxy 性能相比於之前版本提升了很多;
    JDK Proxy 是通過攔截器加反射的方式實現的;
    JDK Proxy 只能代理繼承接口的類;
    JDK Proxy 實現和調用起來比較簡單;
    CGLib 是第三方提供的工具,基於 ASM 實現的,性能比較高;
    CGLib 無需通過接口來實現,它是通過實現子類的方式來完成調用的。

面試常考點分析

本課時考察的是你對反射、動態代理及 CGLib 的瞭解,很多人經常會把反射和動態代理劃爲等號,但從嚴格意義上來說,這種想法是不正確的,真正能搞懂它們之間的關係,也體現了你紮實 Java 的基本功。和這個問題相關的知識點,還有以下幾個:

    你對 JDK Proxy 和 CGLib 的掌握程度。
    Lom

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