#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主要會作如下工做:接口
#4、cglib 動態代理建立機制----經過類繼承 cglib 建立某個類A的動態代理類的模式是:圖片
參考文獻:
http://www.360doc.com/content/14/0801/14/1073512_398598312.shtml