1. 程式人生 > >動態代理 兩種方式

動態代理 兩種方式

代理類Proxy和RealSubject應該實現了相同的功能介面,在面向物件的程式設計之中,如果想要兩個物件實現相同的功能,有以下兩種方式:

1)  定義一個功能介面,然後代理類Proxy和真實類RealSubject都實現這個介面。

2)  代理類Proxy繼承RealSubject,這樣Proxy則擁有了RealSubject的功能,Proxy還可以通過重寫RealSubject中的方法,來實現多型。

其中JDK中提供的建立動態代理的機制就是以1方式設計的,而cglib則是以2方式設計的。

1、JDK的動態代理機制

Jdk為RealSubject物件建立動態代理物件,主要做了以下工作:

1) 獲取RealSubject上的所有介面列表。

2) 確定要生成的動態代理類的類名,預設為com.sun.proxy.$ProxyXXX

3) 根據需要實現介面資訊,在程式碼中動態建立該Proxy的位元組碼

4) 將對應的位元組碼轉換為對應的class物件

5) 建立InvocationHandler例項,用來處理Proxy所有方法呼叫

6) Proxy的class物件以建立的handler物件為參,例項化Proxy物件

Jdk通過java.lang.reflect.Proxy來支援動態代理,一般情況下,使用方法newProxyInstanceof來建立Proxy類,而對於InvocationHandler,需要實現它的invoke方法,在呼叫代理物件中的每一個方法時,在程式碼內部,都是直接呼叫了InvocationHandler的invoke方法,而invoke方法根據代理類傳遞給自己的method引數來區分是什麼方法。

Java動態代理技術的兩種方式

2、cglib的動態代理機制

JDK中提供的生成動態代理類的機制有個鮮明的特點是: 某個類必須有實現的介面,而生成的代理類也只能代理某個類介面定義的方法果某個類沒有實現介面,那麼這個類就不能同JDK產生動態代理了!CGLIB(Code Generation Library),是一個強大的,高效能,高質量的Code生成類庫,它可以在執行期擴充套件Java類與實現Java介面。

cglib 建立某動態代理類的模式是:

1)  查詢類上的所有非final的public型別的方法定義

2)  將這些方法的定義轉換成位元組碼

3)  將組成的位元組碼轉換成相應的代理的class物件

4) 

 實現MethodInterceptor介面,用來處理對代理類上所有方法的請求(和InvocationHandler的功能和角色是一樣的)

Java動態代理技術的兩種方式
Java動態代理技術的兩種方式
cglib需要的jar包有asm.jar、cglib.jar