動(dòng)態(tài)代理是指系統(tǒng)根據(jù)要代理的接口,自動(dòng)幫我們生成并編譯和加載代理類,并將代理類中的代理邏輯抽象到 InvocationHandler 的invoke方法中,由開發(fā)者實(shí)現(xiàn)。在靜態(tài)代理中,我們需要自己實(shí)現(xiàn)代理類,將代理邏輯也寫在代理類里面。而動(dòng)態(tài)代理省去了我們自己寫代理類的工作,系統(tǒng)只需要知道要代理的接口,然后利用反射獲取接口的方法信息,生成代理類,代理類其實(shí)只是些模板代碼,而又為了能定制代理邏輯,系統(tǒng)便定義了一個(gè) InvocationHandler,生成的代理類中的方法都會(huì)調(diào)用 InvocationHandler 中的invoke方法,并將代理類對(duì)象,接口的方法對(duì)象,方法參數(shù)傳入。所以真正的代理邏輯在 InvocationHandler 類中。
本質(zhì):就是將原來自己編寫的代理類(靜態(tài)代理)轉(zhuǎn)化給系統(tǒng)幫我們自動(dòng)生成。
接口:

目標(biāo)對(duì)象:必須實(shí)現(xiàn)上面接口

動(dòng)態(tài)代理:

注意:通過實(shí)現(xiàn)InvocationHandler 接口在invoke方法編寫自己本身需要實(shí)現(xiàn)的業(yè)務(wù)邏輯。
而invoke方法在生成的代理對(duì)象調(diào)用自己方法時(shí)觸發(fā)運(yùn)行。
使用Proxy.newProxyInstance(
car.getClass().getClassLoader(),//此處的car對(duì)象必須是接口類型
car.getClass().getInterfaces(),//此處的car對(duì)象必須是接口類型
this);獲取生成的代理對(duì)象。
測試:
