一,靜態(tài)代理
針對(duì)于網(wǎng)上大多數(shù)靜態(tài)代理寫(xiě)成裝飾者模式(裝飾著模式和靜態(tài)代理的區(qū)別https://blog.csdn.net/weixin_35609314/article/details/78913635),做了一下總結(jié):
1,被代理的對(duì)象必須是一個(gè)類(lèi),且必須有父接口或者父類(lèi);
2,被代理的類(lèi)需要增強(qiáng)的方法必須在父類(lèi)或者父接口中出現(xiàn);
3,靜態(tài)代理的使用目的是為了保護(hù)和隱藏目標(biāo)對(duì)象,所以代理類(lèi)的無(wú)參構(gòu)造器中就創(chuàng)建目標(biāo)對(duì)象。
二,缺點(diǎn):
1,因?yàn)榇韺?duì)象需要與目標(biāo)對(duì)象實(shí)現(xiàn)一樣的接口,所以會(huì)有很多代理類(lèi),類(lèi)太多
2,如果代理對(duì)象實(shí)現(xiàn)的是接口,父接口中增加方法,目標(biāo)對(duì)象與代理對(duì)象都要維護(hù)
動(dòng)態(tài)代理方式可以解決上述缺點(diǎn)
三,動(dòng)態(tài)代理
也叫jdk代理,java底層封裝了實(shí)現(xiàn)細(xì)節(jié),格式固定,代碼簡(jiǎn)單。直接調(diào)用java.lang.reflect.Proxy的靜態(tài)方法newProxyInstance即可
1,被代理的對(duì)象必須是一個(gè)類(lèi),且必須有父接口;
2,被代理的類(lèi)需要增強(qiáng)的方法必須在父接口中出現(xiàn);
static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
四,參數(shù):
1,ClassLoader loader,:指定當(dāng)前目標(biāo)對(duì)象使用類(lèi)加載器,獲取加載器的方法是固定的
2,Class<?>[] interfaces,:目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類(lèi)型,使用泛型方式確認(rèn)類(lèi)型
3,InvocationHandler h:事件處理,執(zhí)行目標(biāo)對(duì)象的方法時(shí),會(huì)觸發(fā)事件處理器的方法,會(huì)把當(dāng)前執(zhí)行目標(biāo)對(duì)象的方法作為參數(shù)傳入