在Spring中的AOP是依靠動态代理來實作切面程式設計的.
而這兩者又是有差別的.
JDK是基于反射機制,生成一個實作代理接口的匿名類,然後重寫方法,實作方法的增強.
它生成類的速度很快,但是運作時因為是基于反射,調用後續的類操作會很慢.
而且他是隻能針對接口程式設計的.
CGLIB是基于繼承機制,繼承被代理類,是以方法不要聲明為final,然後重寫父類方法達到增強了類的作用.
它底層是基于asm第三方架構,是對代理對象類的class檔案加載進來,通過修改其位元組碼生成子類來處理.
生成類的速度慢,但是後續執行類的操作時候很快.
可以針對類和接口.
因為jdk是基于反射,CGLIB是基于位元組碼.是以性能上會有差異.
在老版本CGLIB的速度是JDK速度的10倍左右,但是CGLIB啟動類比JDK慢8倍左右,但是實際上JDK的速度在版本更新的時候每次都提高很多性能,而CGLIB仍止步不前.
在對JDK動态代理與CGlib動态代理的代碼實驗中看,1W次執行下,JDK7及8的動态代理性能比CGlib要好20%左右。
具體應用:
如果目标對象實作了接口,預設情況下是采用JDK動态實作AOP
如果目标對象沒有實作接口,必須采用CGLIB庫.
如何強制使用CGLIB實作AOP?
4. 添加CGLIB庫,SPRING_HOME/cglib/*.jar
5. 在spring配置檔案中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
提問:
什麼是反射?
- 反射是可以在運作時期動态擷取任何類的資訊,如屬性和方法.
-
反射是可以在運作時期動态調用任何類的屬性和方法.
這種動态調用擷取資訊和動态調用類的方法叫做反射.
反射有什麼優點?
反射可以動态通路和調用類的方法和屬性,而不局限于寫死.提高了程式的擴充性,降低耦合度.允許程式建立可控制任何對象.
反射有什麼缺點?
- 性能問題
- 内部暴露問題,因為可以通路私有變量,出現問題
-
安全限制
參考:
https://blog.csdn.net/cnzl0123/article/details/73459750
問題:Java反射機制可以動态修改執行個體中final修飾的成員變量嗎?
回答是分兩種情況的。
- 當final修飾的成員變量在定義的時候就初始化了值,那麼java反射機制就已經不能動态修改它的值了。
- 當final修飾的成員變量在定義的時候并沒有初始化值的話,那麼就還能通過java反射機制來動态修改它的值。
如何通過反射擷取和修改類中的私有變量和方法?
http://www.360doc.com/content/17/0123/23/7662927_624442647.shtml