溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java靜態(tài)代理與動(dòng)態(tài)代理的概念

發(fā)布時(shí)間:2021-09-09 14:20:09 來源:億速云 閱讀:98 作者:chen 欄目:編程語言

本篇內(nèi)容介紹了“java靜態(tài)代理與動(dòng)態(tài)代理的概念”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

        1.靜態(tài)代理:編譯時(shí)生成代理,也稱編譯時(shí)增強(qiáng)。

        2.動(dòng)態(tài)代理:運(yùn)行時(shí)生成代理,也成為運(yùn)行時(shí)增強(qiáng)。

 動(dòng)態(tài)代理:動(dòng)態(tài)代理有兩種常見實(shí)現(xiàn)方式。

  a.cglib動(dòng)態(tài)代理。代理的是類,不需要實(shí)現(xiàn)接口。通過派生類的子類來實(shí)現(xiàn)代理。通過在運(yùn)行時(shí),動(dòng)態(tài)修改字節(jié)碼達(dá)到修改類的目的。

  b.jdk動(dòng)態(tài)代理。實(shí)現(xiàn)類InvocationHandler接口的invoker方法,但是注意代理的是接口。也就是說業(yè)務(wù)類必須要實(shí)現(xiàn)接口,通過Proxy里的newProxyInstance得到代理對(duì)象。

     在java.lang.reflect包中,提供一個(gè)Proxy類和InvocationHandler接口,通過這個(gè)類和接口可以生成JDK的動(dòng)態(tài)代理。

1,通過實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建自己的調(diào)用處理器

InvocationHandlerImpl 實(shí)現(xiàn)了 InvocationHandler 接口,并能實(shí)現(xiàn)方法調(diào)用從代理類到委托類的分派轉(zhuǎn)發(fā)
InvocationHandler handler = new InvocationHandlerImpl(..);

2,通過為 Proxy 類指定 ClassLoader 對(duì)象和一組 interface 來創(chuàng)建動(dòng)態(tài)代理類;

// 通過 Proxy 為包括 Interface 接口在內(nèi)的一組接口動(dòng)態(tài)創(chuàng)建代理類的類對(duì)象
Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class, ... });

3,通過反射機(jī)制獲得動(dòng)態(tài)代理類的構(gòu)造函數(shù),其唯一參數(shù)類型是調(diào)用處理器接口類型;

// 通過反射從生成的類對(duì)象獲得構(gòu)造函數(shù)對(duì)象
Constructor constructor = clazz.getConstructor(new Class[] { InvocationHandler.class });

4,通過構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類實(shí)例,構(gòu)造時(shí)調(diào)用處理器對(duì)象作為參數(shù)被傳入。

// 通過構(gòu)造函數(shù)對(duì)象創(chuàng)建動(dòng)態(tài)代理類實(shí)例
Interface Proxy = (Interface)constructor.newInstance(new Object[] { handler });

為了簡(jiǎn)化對(duì)象創(chuàng)建過程,Proxy類中的newProxyInstance封裝了2-4步驟,只需兩步即可完成代理對(duì)象的創(chuàng)建。

// 通過 Proxy 直接創(chuàng)建動(dòng)態(tà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)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI