JAVA動態代理

#1、根據.class文件生成二進制字節碼 因爲JVM經過字節碼的二進制信息加載類,那麼,若是在運行期系統中,遵循Java編譯系統組織.class文件的格式和結構,生成對應的二進制數據,而後再把這個二進制數據加載轉換成對應的類,這樣,就完成了在代碼中,動態建立一個類的能力;html

輸入圖片說明

在運行期能夠按照Java虛擬機規範對class文件的組織規則生成對應的二進制字節碼; 也能夠經過開源框架ASM、Javassist(jboss)完成。編程

#2、代理模式 代理模式上,基本上有Subject角色,RealSubject角色,Proxy角色。其中:Subject角色負責定義RealSubject和Proxy角色應該實現的接口;RealSubject角色用來真正完成業務服務功能;Proxy角色負責將自身的Request請求,調用realsubject 對應的request功能來實現業務功能,本身不真正作業務。框架

輸入圖片說明

動態代理工做的基本模式就是將本身的方法功能的實現交給 InvocationHandler角色,外界對Proxy角色中的每個方法的調用,Proxy角色都會交給InvocationHandler來處理,而InvocationHandler則調用具體對象角色的方法。以下圖所示:設計

輸入圖片說明

在這種模式之中:代理Proxy 和RealSubject 應該實現相同的功能,這一點至關重要。(這裏說的功能,能夠理解爲某個類的public方法)。代理

在面向對象的編程之中,若是咱們想要約定Proxy 和RealSubject能夠實現相同的功能,有兩種方式:
a. 一個比較直觀的方式,就是定義一個功能接口,而後讓Proxy 和RealSubject來實現這個接口。htm

b. 還有比較隱晦的方式,就是經過繼承。由於若是Proxy 繼承自RealSubject,這樣Proxy則擁有了RealSubject的功能,Proxy還能夠經過重寫RealSubject中的方法,來實現多態。對象

其中JDK中提供的建立動態代理的機制,是以a 這種思路設計的,而cglib 則是以b思路設計的。繼承

#3、JDK的動態代理建立機制----經過接口 好比如今想爲RealSubject這個類建立一個動態代理對象,JDK主要會作如下工做:接口

  1. 獲取 RealSubject上的全部接口列表;
  2. 肯定要生成的代理類的類名,默認爲:com.sun.proxy.$ProxyXXXX ;
  3. 根據須要實現的接口信息,在代碼中動態建立 該Proxy類的字節碼;
  4. 將對應的字節碼轉換爲對應的class 對象;
  5. 建立InvocationHandler 實例handler,用來處理Proxy全部方法調用;
  6. Proxy 的class對象 以建立的handler對象爲參數,實例化一個proxy對象;

#4、cglib 動態代理建立機制----經過類繼承 cglib 建立某個類A的動態代理類的模式是:圖片

  1. 查找A上的全部非final 的public類型的方法定義;
  2. 將這些方法的定義轉換成字節碼(ASM);
  3. 將組成的字節碼轉換成相應的代理的class對象;
  4. 實現 MethodInterceptor接口,用來處理 對代理類上全部方法的請求(這個接口和JDK動態代理InvocationHandler的功能和角色是同樣的)

參考文獻:
http://www.360doc.com/content/14/0801/14/1073512_398598312.shtml

相關文章
相關標籤/搜索