### 什么是代理?
簡單點講,代理就是幫[目標(biāo)對象]去完成它應(yīng)該做,但是不想或者不擅長做的事情。
例子:
媒婆:幫你找對象。
黃牛:幫你去掛號。
社保代辦:幫你繳納社保。
* 對于動態(tài)代理的學(xué)習(xí)目標(biāo)
* 了解代理對象是如何產(chǎn)生的?牽扯到Classloader的理解
* 會編寫JDK和cglib的動態(tài)代理代碼
* 了解代理對象和InvocationHandler實現(xiàn)類直接的關(guān)系(調(diào)用關(guān)系)
* 代理模式分為靜態(tài)代理和動態(tài)代理
* 靜態(tài)代理:就是編寫一個代理類,去代理[目標(biāo)對象]
* 動態(tài)代理:在運行期間,通過反射,對[目標(biāo)對象]產(chǎn)生一個[代理對象]
* 動態(tài)代理的實現(xiàn)方式分為兩種,下面兩種方式生成的代理類都是繼承了Proxy:
* JDK實現(xiàn)的? ? ? :基于接口的,也就是說[目標(biāo)對象]必須實現(xiàn)一個接口,[目標(biāo)對象]和[代理對象]都實現(xiàn)該接口
* 目錄類必須實現(xiàn)接口
```
* 編寫代理工廠類 implements InvocationHandler{
getProxy(target){return Proxy.newInstance(Classloader,interface,this)}
invoke(proxy,method,args)方法
}
* 生成的代理對象
public final void saveUser()
throws
{
try
{
this.h.invoke(this, m3, null); // h 就是上面的代理工廠類
return;
}
catch (Error|RuntimeException localError)
{
throw localError;
}
catch (Throwable localThrowable)
{
throw new UndeclaredThrowableException(localThrowable);
}
}
```
* cglib實現(xiàn)的 :可以被繼承的普通類,它是通過繼承的方式,產(chǎn)生一個子類,這個子類就是代理類
* 為什么使用動態(tài)代理呢?
增強對象的功能。這種增強,是符合開閉原則的,不會對目標(biāo)對象進行修改,只需要擴展就可以實現(xiàn)增強