java面試題(楊曉峰)---第六講談談動態代理是基於什么原理?


我在編譯時不知道,而在運行時知道,那么肯定在運行時給了提示,這個提示就是額外功.好處是可以重復利用相同代碼.

 

代理模式:通過代理靜默的解決一些與業務無關的問題,例如遠程,安全,事物,日志,資源關閉,...讓應用開發者可以只關心自身業務.

靜態代理:事先寫好代碼類,可以手工編寫,也可以用工具生成.缺點是每個業務類都要有一個對應代理類,非常不靈活.

動態代理:運行時自動生成代理對象.缺點是生成代理對象和調用代理對象都要額外花費時間,

JDK動態代理:基於java反射機制實現,必須要實現了接口的業務類才能用這種辦法生成代理對象.新版本也開始結合ASM機制.

cglib動態代理:基於ASM機制實現,通過生成業務類的子類作為代理類..

java反射機制的常見應用:動態代理(AOP,RPC),提供第三方開發者拓展能力(Servlet容器,JDBC連接),第三方組件創建對象(DI)...

 

 

 

反射與動態代理原理:

反射最大的作用之一就在於我們可以不在編譯時知道某個對象的類型,而在運行時提供完整的"包名+類名.class"得到.注意:不在編譯時,而是在運行時.

功能:

#在運行時能判斷任意一個對象所屬的類.

#在運行時能構造任意一個類的對象

#在運行時能獲得任意一個類所具有的的成員變量和方法.

#在運行時調用任意一個對象的方法.簡單說,利用java反射機制我們可以加載一個運行時才得知名稱的class,獲悉其構造方法,並生成其對象實體,能對其fields設置並喚起其methods.

應用場景:

反射技術常用在各類通用框架開發中.因為為了保證框架的通用性,需要根據配置文件加載不同的對象和類,並調用不同的方法,這個時候就會用到反射---運行時動態加載需要加載的對象.

特點:

由於反射會額外消耗一定的系統資源,因此如果不需要動態的創建一個對象,那么就不需要用反射.另外,反射調用方法時可以忽略權限檢查,因此可能會破壞封裝性而導致安全問題.

 2動態代理

為其他對象提供一種代理以控制對這個對象的訪問,在某種情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在兩者之間起到中介的作用.所謂動態代理,就是實現階段不用關心代理誰,而是在運行階段才指定代理那個對象,如果是自己寫代理類的方法就是靜態代理(確定性).

組成要素:

(動態)代理模式主要涉及三個要素:

#1:抽象類接口

#2:被代理類(具體實現抽象接口的類)

#3:動態代理類:實際調用被代理類的方法和屬性的類

實現方法:

實現動態代理的方法有很多,比如JDK自身提供的動態代理,就是主要利用了反射機制,還有其他的實現方式,比如利用字節碼操作機制,類似ASM,CGLIB(基於ASM),Javassist等.

舉例:常常采用JDK提供的動態代理接口InvocationHandler來實現動態代理類.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM