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


業(yè)務(wù)場(chǎng)景

  1. 舊業(yè)務(wù)
  • 買(mǎi)家調(diào)用action,購(gòu)買(mǎi)衣服,衣服在數(shù)據(jù)庫(kù)的標(biāo)價(jià)為50元,購(gòu)買(mǎi)流程就是簡(jiǎn)單的調(diào)用。
  1. 新業(yè)務(wù)
  • 在原先的價(jià)格上可以使用優(yōu)惠券,但是這個(gè)功能在以前沒(méi)有實(shí)現(xiàn)過(guò),我們通過(guò)代理類(lèi),代理了原先的接口方法,在這個(gè)方法的基礎(chǔ)上,修改了返回值。
    mark

代理實(shí)現(xiàn)流程

  1. 書(shū)寫(xiě)代理類(lèi)和代理方法,在代理方法中實(shí)現(xiàn)代理Proxy.newProxyInstance
  2. 代理中需要的參數(shù)分別為:被代理的類(lèi)的類(lèi)加載器soneObjectclass.getClassLoader(),被代理類(lèi)的所有實(shí)現(xiàn)接口new Class[] { Interface.class },句柄方法new InvocationHandler()
  3. 在句柄方法中復(fù)寫(xiě)invoke方法,invoke方法的輸入有3個(gè)參數(shù)Object proxy(代理類(lèi)對(duì)象), Method method(被代理類(lèi)的方法),Object[] args(被代理類(lèi)方法的傳入?yún)?shù)),在這個(gè)方法中,我們可以定制化的開(kāi)發(fā)新的業(yè)務(wù)。
  4. 獲取代理類(lèi),強(qiáng)轉(zhuǎn)成被代理的接口
  5. 最后,我們可以像沒(méi)被代理一樣,調(diào)用接口的認(rèn)可方法,方法被調(diào)用后,方法名和參數(shù)列表將被傳入代理類(lèi)的invoke方法中,進(jìn)行新業(yè)務(wù)的邏輯流程。

原業(yè)務(wù)接口IBoss

public interface IBoss {//接口
    int yifu(String size);
}

原業(yè)務(wù)實(shí)現(xiàn)類(lèi)

public class Boss implements IBoss{
    public int yifu(String size){
        System.err.println("天貓小強(qiáng)旗艦店,老板給客戶(hù)發(fā)快遞----衣服型號(hào):"+size);
        //這件衣服的價(jià)錢(qián),從數(shù)據(jù)庫(kù)讀取
        return 50;
    }
    public void kuzi(){
        System.err.println("天貓小強(qiáng)旗艦店,老板給客戶(hù)發(fā)快遞----褲子");
    }
}

原業(yè)務(wù)調(diào)用

public class SaleAction {
        @Test
    public void saleByBossSelf() throws Exception {
        IBoss boss = new Boss();
        System.out.println("老板自營(yíng)!");
        int money = boss.yifu("xxl");
        System.out.println("衣服成交價(jià):" + money);
    }
}

代理類(lèi)

public static IBoss getProxyBoss(final int discountCoupon) throws Exception {
    Object proxedObj = Proxy.newProxyInstance(Boss.class.getClassLoader(),
            new Class[] { IBoss.class }, new InvocationHandler() {
                public Object invoke(Object proxy, Method method,
                        Object[] args) throws Throwable {
                        Integer returnValue = (Integer) method.invoke(new Boss(),
                                args);// 調(diào)用原始對(duì)象以后返回的值
                        return returnValue - discountCoupon;
                }
            });
    return (IBoss)proxedObj;
}
}

新業(yè)務(wù)調(diào)用

public class ProxySaleAction {
        @Test
    public void saleByProxy() throws Exception {
        IBoss boss = ProxyBoss.getProxyBoss(20);// 將代理的方法實(shí)例化成接口
        System.out.println("代理經(jīng)營(yíng)!");
        int money = boss.yifu("xxl");// 調(diào)用接口的方法,實(shí)際上調(diào)用方式?jīng)]有變
        System.out.println("衣服成交價(jià):" + money);
    }
}
最后編輯于
?著作權(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)容

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