天天看點

Java -- 每日一問:動态代理是基于什麼原理?

Java -- 每日一問:動态代理是基于什麼原理?

典型回答

反射機制是 Java 語言提供的一種基礎功能,賦予程式在運作時自省(introspect,官方用語)的能力。通過反射我們可以直接操作類或者對象,比如擷取某個對象的類定義,擷取類聲明的屬性和方法,調用方法或者構造對象,甚至可以運作時修改類定義。

動态代理是一種友善運作時動态建構代理、動态處理代理方法調用的機制,很多場景都是利用類似機制做到的,比如用來包裝 RPC 調用、面向切面的程式設計(AOP)。

實作動态代理的方式很多,比如 JDK 自身提供的動态代理,就是主要利用了上面提到的反射機制。還有其他的實作方式,比如利用傳說中更高性能的位元組碼操作機制,類似 ASM、cglib(基于 ASM)、Javassist 等。

高手回答

反射與動态代理原理

1 關于反射

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

功能:

•在運作時能判斷任意一個對象所屬的類。

•在運作時能構造任意一個類的對象。

•在運作時判斷任意一個類所具有的成員變量和方法。

•在運作時調用任意一個對象的方法。

說大白話就是,利用Java反射機制我們可以加載一個運作時才得知名稱的class,獲悉其構造方法,并生成其對象實體,能對其fields設值并喚起其methods。

應用場景:

反射技術常用在各類通用架構開發中。因為為了保證架構的通用性,需要根據配置檔案加載不同的對象或類,并調用不同的方法,這個時候就會用到反射——運作時動态加載需要加載的對象。

特點:

由于反射會額外消耗一定的系統資源,是以如果不需要動态地建立一個對象,那麼就不需要用反射。另外,反射調用方法時可以忽略權限檢查,是以可能會破壞封裝性而導緻安全問題。

2 動态代理

為其他對象提供一種代理以控制對這個對象的通路。在某些情況下,一個對象不适合或者不能直接引用另一個對象,而代理對象可以在兩者之間起到中介的作用(可類比房屋中介,房東委托中介銷售房屋、簽訂合同等)。

所謂動态代理,就是實作階段不用關心代理誰,而是在運作階段才指定代理哪個一個對象(不确定性)。如果是自己寫代理類的方式就是靜态代理(确定性)。

組成要素:

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

其一:抽象類接口

其二:被代理類(具體實作抽象接口的類)

其三:動态代理類:實際調用被代理類的方法和屬性的類