Java動態代理機制分析

 Java 動態代理機制的出現,使得 Java 開發人員不用手工編寫代理類,只要簡單地指定一組接口及委託類對象,便能動態地獲得代理類。代理類會負責將所有的方法調用分派到委託對象上反射執行,在分派執行的過程中,開發人員還可以按需調整委託類對象及其功能,這是一套非常靈活有彈性的代理框架。

代理是一種常用的設計模式,其目的就是爲其他對象提供一個代理以控制對某個對象的訪問。代理類負責爲委託類預處理消息,過濾消息並轉發消息,以及進行消息被委託類執行後的後續處理。Spring中的織入(weaving)就是使用Java提供代理來實現的(以後會詳細介紹關於Spring的AOP編程,這裏就不多說了..)

爲了保持行爲的一致性,代理類和委託類通常會實現相同的接口,所以在訪問者看來兩者沒有絲毫的區別。通過代理類這中間一層,能有效控制對委託類對象的直接訪問,也可以很好地隱藏和保護委託類對象,同時也爲實施不同控制策略預留了空間,從而在設計上獲得了更大的靈活性。Java 動態代理機制以巧妙的方式近乎完美地實踐了代理模式的設計理念。

 

要了解Java動態代理機制,首先需要了解以下的類或接口:

java.lang.reflect.Proxy:這是 Java 動態代理機制的主類,它提供了一組靜態方法來爲一組接口動態地生成代理類及其對象。

 

方法 一 下面的註解已經解釋的很清楚了,該方法用於獲得指定代理對象所關聯的調用處理器

 

 

  

方法 二 getProxyClass()用於獲取關聯於指定類裝載器和一組接口的動態代理類的類對象

 

 

 

 方法 三 用於判斷指定類對象是否是一個動態代理類

 

 

 

 方法 四 用於爲指定類裝載器、一組接口及調用處理器生成動態代理類實例

 

 

java.lang.reflect.InvocationHandler:這是調用處理器接口,它自定義了一個 invoke 方法,用於集中處理在動態代理類對象上的方法調用,通常在該方法中實現對委託類的代理訪問

 


java.lang.ClassLoader:這是類裝載器類,負責將類的字節碼裝載到 Java 虛擬機(JVM)中併爲其定義類對象,然後該類才能被使用。Proxy 靜態方法生成動態代理類同樣需要通過類裝載器來進行裝載才能使用,它與普通類的唯一區別就是其字節碼是由 JVM 在運行時動態生成的而非預存在於任何一個 .class 文件中。

每次生成動態代理類對象時都需要指定一個類裝載器對象

 

下面我們就來看一個通過Java動態代理實現的實例程序:

 

首先,我們需要了解Java動態代理的4個步驟:

  1. 通過實現 InvocationHandler 接口創建自己的調用處理器;
  2. 通過爲 Proxy 類指定 ClassLoader 對象和一組 interface 來創建動態代理類;
  3. 通過反射機制獲得動態代理類的構造函數,其唯一參數類型是調用處理器接口類型;
  4. 通過構造函數創建動態代理類實例,構造時調用處理器對象作爲參數被傳入。

實例目標:使用Java代理機制,實現用戶登錄前的安全性檢查

步驟一、創建一個接口

 

 

步驟二、實現LoginInterface

 

 

 

步驟三、創建動態代理對象

 

 

 

 

步驟四、創建動態代理類實例,實現用戶登錄安全性檢查

 

 

 

運行結果:

查看代理類:$Proxy0
用戶登錄前代理類需要進行安全性檢查...
用戶登錄...

當然目前我們對動態代理的理解還僅僅浮於表面,至於Proxy 到底是如何實現的?以及緩存表中的使用等等...還需要我們不斷的研究.我相信源代碼始終是我們最好的老師,加油!  I like Open Source ~~

 

 

 

 

 

 

 

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