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

  • 什么是代理。舉個(gè)例子,比如代理某個(gè)品牌,你在通過(guò)授權(quán)之后,出售他們的產(chǎn)品,在出售的過(guò)程中,你可以調(diào)整價(jià)格,開(kāi)展優(yōu)惠活動(dòng)。相當(dāng)于在原有的銷(xiāo)售流程上加上任何你想加的東西,甚至你都可以直接把他們的產(chǎn)品扔掉。

接下來(lái)就用具體的代碼來(lái)說(shuō)明。我們就以蘋(píng)果(Apple)的產(chǎn)品為例。

首先對(duì)蘋(píng)果的產(chǎn)品有一個(gè)統(tǒng)一的接口

public interface Apple {
    void sell();//蘋(píng)果產(chǎn)品的出售方法
}

然后官方的iPhone X(請(qǐng)忽略首字母沒(méi)大寫(xiě))

public class iPhoneX implements Apple {

    @Override
    public void sell() {
        System.out.println("The price is 8316 RMB");
    }
}

現(xiàn)在我要代理這款產(chǎn)品,我要想一個(gè)代理方案。我決定在顧客買(mǎi)了我的iPhone X之后,送他們一副耳機(jī)。

//這是我的代理方案
public class iPhoneXProxyHandler implements InvocationHandler {

    private iPhoneX x;

    public iPhoneXProxyHandler(iPhoneX x) {
        this.x = x;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = method.invoke(x, args);//按照原價(jià)賣(mài)給客戶
        System.out.println("贈(zèng)送一副耳機(jī)");//這是額外的優(yōu)惠
        return result;
    }
}

public iPhoneX x = new iPhoneX();//這是從官方進(jìn)貨的iPhone X
public iPhoneXProxyHandler handler = new  iPhoneXProxyHandler(x);//這是我的代理方案,代理上面的iPhone X
//獲得我代理的iPhone X
public iPhoneX iPhoneXProxy = (iPhoneX) Proxy.newProxyInstance(x.getClass().getClassLoader(), x.getClass().getInterfaces(), handler);

現(xiàn)在我已將官方的iPhone X作為了我的代理產(chǎn)品?,F(xiàn)在我要把它賣(mài)掉。

iPhoneXProxy.sell();

>The price is 8316 RMB
>贈(zèng)送一副耳機(jī)

好了,現(xiàn)在我已經(jīng)把我代理的產(chǎn)品買(mǎi)掉了?,F(xiàn)在我準(zhǔn)備代理蘋(píng)果的平板。

public class iPadPro implements Apple {

    @Override
    public void sell() {
        System.out.println("The price is 5143 RMB");
    }
}

然后我決定把所有的代理的平板都砸掉(我怕不是個(gè)傻子吧)

//這是我的砸產(chǎn)品的代理方案
public class DestroyProxyHandler implements InvocationHandler {

    private Object obj;

    public DestroyProxyHandler(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("被砸掉了");
        return null;
    }
}

public iPadPro ipad = new iPadPro();//這是從官方進(jìn)貨的iPad Pro
public DestroyProxyHandler handler = new  DestroyProxyHandler(ipad);//這是我的代理方案,代理上面的iPad Pro
//獲得我代理的iPad Pro
public iPadPro iPadProProxy = (iPadPro) Proxy.newProxyInstance(ipad.getClass().getClassLoader(), ipad.getClass().getInterfaces(), handler);

然后。。。

iPadProProxy.sell();

>被砸掉了

結(jié)束!


其實(shí)可以聯(lián)系到Android Retrofit的注解請(qǐng)求方式和MyBatis的Mapper應(yīng)該都是使用動(dòng)態(tài)代理,只需要注解上的字段,所以不需要實(shí)現(xiàn)類(lèi)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 相關(guān)概念1.1 代理??在某些情況下,我們不希望或是不能直接訪問(wèn)對(duì)象 A,而是通過(guò)訪問(wèn)一個(gè)中介對(duì)象 B,由 B 去...
    天空在微笑閱讀 472評(píng)論 0 0
  • 前言 本文是我在學(xué)習(xí)代理模式時(shí)的一篇筆記,除了對(duì)代理模式、靜態(tài)和動(dòng)態(tài)代理的概念和實(shí)現(xiàn)進(jìn)行了描述外,還有關(guān)于動(dòng)態(tài)代理...
    不愿透露姓名的孔海碩先生閱讀 378評(píng)論 0 0
  • 之前介紹的反射和注解都是Java中的動(dòng)態(tài)特性,還有即將介紹的動(dòng)態(tài)代理也是Java中的一個(gè)動(dòng)態(tài)特性。這些動(dòng)態(tài)特性使得...
    Single_YAM閱讀 2,105評(píng)論 0 9
  • 例子 1,先創(chuàng)建teacher接口 2,創(chuàng)建teacher實(shí)現(xiàn)類(lèi) 3,創(chuàng)建teacher代理類(lèi),java 的動(dòng)態(tài)代...
    MrTT閱讀 429評(píng)論 0 1
  • 一個(gè)人,一個(gè)人,一個(gè)人。 很多人不喜歡一個(gè)人,一個(gè)人代表著孤單沒(méi)有說(shuō)話的玩伴,陪伴慣了,你自己一個(gè)人走路也會(huì)感覺(jué)怪...
    ec098aef70b1閱讀 325評(píng)論 0 1

友情鏈接更多精彩內(nèi)容