1. 程式人生 > >代理模式--學習慕課模式的祕密-代理模式 記錄

代理模式--學習慕課模式的祕密-代理模式 記錄

遠端代理 虛擬代理 保護代理 智慧引用代理

兩種實現方式:靜態代理 、動態代理

靜態代理:代理和被代理物件在代理之前是確定的。他們都是實現相同的介面或繼承相同的抽象類

實現方式:繼承、組合

1.繼承

繼承被代理物件,覆蓋重寫方法,做相關處理

2.組合

代理類引入被代理類,重寫相關方法,實現業務邏輯,再在代理類中執行被代理物件原業務

組合方式更好

動態代理:

JDK動態代理

1.Interface InvocaionHandler 該介面中僅定義了一個方法 public object invoke(Object obj,Method method,Object[] args)

obj 代理類, method被代理的方法,args 該方法的引數陣列

InvocationHandler位於java.lang.reflec包下

2.Proxy 代理類

static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

返回代理類的一個例項,返回後的代理類可以當作被代理類使用(可使用被代理類的在介面中宣告過的方法)

使用動態代理類時,必須實現InvocationHandler介面

實現步驟

1.建立一個實現介面InvocationHandler的類,它必須實現invoke方法

2.建立被代理的類以及介面

3.呼叫Proxy的靜態方法,建立一個代理類 newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h)

4.通過代理類呼叫方法

與CGLIB 區別

jdk動態代理只能代理實現了某些介面的類

CGLIB時針對類來實現代理的,對指定的目標類產生一個子類,通過方法攔截技術攔截所有父類方法的呼叫 不能對final類實現代理

CGLIB動態代理

代理類需要實現MethodInterceptor介面 實現 intercept方法

public Object intercept(Object obj,Method m,object[] args,MethodProxy proxy)

攔截所有目標類方法的呼叫

obj 目標類的例項

m 目標方法的發射物件

args 方法的引數

proxy 代理類的例項

Enhancer 類 建立代理類

setSuperclass setCallback create

JDK動態代理實現思路

1.宣告一段原始碼(動態產生代理)

2.編譯原始碼(JDK Comoiler API),產生新的類(代理類)

3.將這個類load到記憶體中,產生一個新的物件(代理物件)

4.return代理物件