本篇內(nèi)容介紹了“java靜態(tài)代理與動(dòng)態(tài)代理的概念”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)建站專(zhuān)注于合陽(yáng)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供合陽(yáng)營(yíng)銷(xiāo)型網(wǎng)站建設(shè),合陽(yáng)網(wǎng)站制作、合陽(yáng)網(wǎng)頁(yè)設(shè)計(jì)、合陽(yáng)網(wǎng)站官網(wǎng)定制、小程序設(shè)計(jì)服務(wù),打造合陽(yáng)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供合陽(yáng)網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
1.靜態(tài)代理:編譯時(shí)生成代理,也稱(chēng)編譯時(shí)增強(qiáng)。
2.動(dòng)態(tài)代理:運(yùn)行時(shí)生成代理,也成為運(yùn)行時(shí)增強(qiáng)。
動(dòng)態(tài)代理:動(dòng)態(tài)代理有兩種常見(jiàn)實(shí)現(xiàn)方式。
a.cglib動(dòng)態(tài)代理。代理的是類(lèi),不需要實(shí)現(xiàn)接口。通過(guò)派生類(lèi)的子類(lèi)來(lái)實(shí)現(xiàn)代理。通過(guò)在運(yùn)行時(shí),動(dòng)態(tài)修改字節(jié)碼達(dá)到修改類(lèi)的目的。
b.jdk動(dòng)態(tài)代理。實(shí)現(xiàn)類(lèi)InvocationHandler接口的invoker方法,但是注意代理的是接口。也就是說(shuō)業(yè)務(wù)類(lèi)必須要實(shí)現(xiàn)接口,通過(guò)Proxy里的newProxyInstance得到代理對(duì)象。
在java.lang.reflect包中,提供一個(gè)Proxy類(lèi)和InvocationHandler接口,通過(guò)這個(gè)類(lèi)和接口可以生成JDK的動(dòng)態(tài)代理。
1,通過(guò)實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建自己的調(diào)用處理器
InvocationHandlerImpl 實(shí)現(xiàn)了 InvocationHandler 接口,并能實(shí)現(xiàn)方法調(diào)用從代理類(lèi)到委托類(lèi)的分派轉(zhuǎn)發(fā)
InvocationHandler handler = new InvocationHandlerImpl(..);
2,通過(guò)為 Proxy 類(lèi)指定 ClassLoader 對(duì)象和一組 interface 來(lái)創(chuàng)建動(dòng)態(tài)代理類(lèi);
// 通過(guò) Proxy 為包括 Interface 接口在內(nèi)的一組接口動(dòng)態(tài)創(chuàng)建代理類(lèi)的類(lèi)對(duì)象
Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class, ... });
3,通過(guò)反射機(jī)制獲得動(dòng)態(tài)代理類(lèi)的構(gòu)造函數(shù),其唯一參數(shù)類(lèi)型是調(diào)用處理器接口類(lèi)型;
// 通過(guò)反射從生成的類(lèi)對(duì)象獲得構(gòu)造函數(shù)對(duì)象
Constructor constructor = clazz.getConstructor(new Class[] { InvocationHandler.class });
4,通過(guò)構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類(lèi)實(shí)例,構(gòu)造時(shí)調(diào)用處理器對(duì)象作為參數(shù)被傳入。
// 通過(guò)構(gòu)造函數(shù)對(duì)象創(chuàng)建動(dòng)態(tài)代理類(lèi)實(shí)例
Interface Proxy = (Interface)constructor.newInstance(new Object[] { handler });
為了簡(jiǎn)化對(duì)象創(chuàng)建過(guò)程,Proxy類(lèi)中的newProxyInstance封裝了2-4步驟,只需兩步即可完成代理對(duì)象的創(chuàng)建。
// 通過(guò) Proxy 直接創(chuàng)建動(dòng)態(tài)代理類(lèi)實(shí)例 Interface proxy = (Interface)Proxy.newProxyInstance( classLoader, new Class[] { Interface.class }, handler );
“java靜態(tài)代理與動(dòng)態(tài)代理的概念”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!