代理模式--學習慕課模式的祕密-代理模式 記錄
遠端代理 虛擬代理 保護代理 智慧引用代理
兩種實現方式:靜態代理 、動態代理
靜態代理:代理和被代理物件在代理之前是確定的。他們都是實現相同的介面或繼承相同的抽象類
實現方式:繼承、組合
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代理物件