溫馨提示×

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

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

CGLIB怎么實(shí)現(xiàn)代理設(shè)計(jì)模式

發(fā)布時(shí)間:2021-08-12 11:04:47 來源:億速云 閱讀:121 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“CGLIB怎么實(shí)現(xiàn)代理設(shè)計(jì)模式”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“CGLIB怎么實(shí)現(xiàn)代理設(shè)計(jì)模式”吧!

CGLIB實(shí)現(xiàn)代理設(shè)計(jì)模式

從Java的官方來講,已經(jīng)明確的要求了如果想要實(shí)現(xiàn)代理設(shè)計(jì)模式,那么一定是基于接口的應(yīng)用,所以在官方給出的Proxy類創(chuàng)建代理對(duì)象時(shí),都需要傳遞該對(duì)象所有的接口信息:

Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this);

但是這個(gè)時(shí)候有一部分開發(fā)者就認(rèn)為不應(yīng)該強(qiáng)迫性的基于接口實(shí)現(xiàn)代理設(shè)計(jì),所以一部分開發(fā)者就開發(fā)出了一個(gè)CGLIB開發(fā)包,利用這個(gè)開發(fā)包就可以實(shí)現(xiàn)基于類的代理設(shè)計(jì)模式。
1、CGLIB是一個(gè)第三方的程序包,需要單獨(dú)在Eclipse中進(jìn)行配置,程序包的路徑為:D:jar-libcglib-nodep-3.2.6.jar,那么需要打開Eclipse項(xiàng)目屬性安裝第三方開發(fā)包;
CGLIB怎么實(shí)現(xiàn)代理設(shè)計(jì)模式

2、編寫程序類,該類不實(shí)現(xiàn)任何接口。

class Message  {public void send() {
        System.out.println("【發(fā)送消息】www.mldn.cn");
    }
}

3、利用CGLIB編寫代理類,但是這個(gè)代理類需要做一個(gè)明確,此時(shí)相當(dāng)于使用了類的形式實(shí)現(xiàn)了代理設(shè)計(jì)的處理,所以該代理設(shè)計(jì)需要通過CGLIB來生成代理對(duì)象,定義一個(gè)代理類:

class MLDNProxy implements MethodInterceptor{  //攔截器配置private Object target;  //保存真實(shí)主題對(duì)象public MLDNProxy(Object target){this.target = target;
    }@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object returnData = null;if(this.connect()){
            returnData = method.invoke(this.target,args);this.close();
        }return returnData ;
    }public boolean connect(){
        System.out.println("【消息代理】進(jìn)行消息發(fā)送通道的連接。");return true;
    }public void close(){
        System.out.println("【消息代理】關(guān)閉消息通道。");
    }
}

4、此時(shí)如果想創(chuàng)建代理類對(duì)象,則就必須進(jìn)行一系列的CGLIB處理。

public class JavaAPIDemo {public static void main(String[] args)throws Exception{
        Message realObject = new Message();   //真實(shí)主體對(duì)象Enhancer enhancer=new Enhancer();  //負(fù)責(zé)代理操作的程序類enhancer.setSuperclass(realObject.getClass());  //假定一個(gè)父類enhancer.setCallback(new MLDNProxy(realObject));  //設(shè)置代理類Message proxyObject= (Message) enhancer.create();  //創(chuàng)建代理對(duì)象proxyObject.send();
    }
}

在進(jìn)行代理設(shè)計(jì)模式定義的時(shí)候,除了使用可以接口之外,還可以不受接口限制而實(shí)現(xiàn)基于類的代理設(shè)計(jì),但從正常的設(shè)計(jì)角度來講,強(qiáng)烈建議還是基于接口的設(shè)計(jì)會(huì)比較合理。

到此,相信大家對(duì)“CGLIB怎么實(shí)現(xiàn)代理設(shè)計(jì)模式”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向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