成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JAVA動態(tài)代理

entner / 2537人閱讀

摘要:代理的分類代理分為靜態(tài)和動態(tài)代理。動態(tài)代理代理類在運行時產(chǎn)生,運用的反射機制動態(tài)創(chuàng)建而成。動態(tài)代理動態(tài)代理又可以分為庫提供的和庫提供,這里我們主要講講提供的動態(tài)代理。被代理對象實現(xiàn)的接口。,用于分派執(zhí)行代理方法。

代理的分類

代理分為靜態(tài)和動態(tài)代理。
靜態(tài)代理:硬編碼實現(xiàn)的代理類,在程序被編譯成.class文件時代理類就已經(jīng)存在。
動態(tài)代理:代理類在運行時產(chǎn)生,運用jdk的反射機制動態(tài)創(chuàng)建而成。

靜態(tài)代理

靜態(tài)代理可以通過組合的方式來實現(xiàn),下面看具體的demo實現(xiàn):

public class ProxyTest {

    @Test
    public void proxyMethodTest() {
       
        StaticProxy staticProxy = new StaticProxy(new ClientObject());
        System.out.println(staticProxy.get());
    }
}

interface ClientObjectInterface {
    public String get ();
}

class ClientObject implements ClientObjectInterface {
    public String get () {
        return "hi";
    }
}

class StaticProxy implements ClientObjectInterface {
    ClientObject clientObject;

    public StaticProxy(ClientObject clientObject) {
        this.clientObject = clientObject;
    }

    public String get() {
        return "proxy " + clientObject.get();
    }
}

運行結(jié)果:
proxy hi

當我們在使用的過程中發(fā)現(xiàn)ClientObject這個類隨著業(yè)務(wù)需求的變化已經(jīng)變得不夠用了,這是我們該怎么辦?保持著對修改關(guān)閉,擴展開放的原則,我們可以通過上面那種靜態(tài)代理的方式來實現(xiàn)業(yè)務(wù)需求的變化,當然下面還有一種比較靈活的動態(tài)代理的方式來處理上面這種case。

動態(tài)代理

動態(tài)代理又可以分為jdk庫提供的和cglib庫提供,這里我們主要講講jdk提供的動態(tài)代理。jdk代理對象是通過java.lang.reflect.Proxy#newProxyInstance來進行創(chuàng)建的。

public static Object newProxyInstance(ClassLoader loader,
                                          Class[] interfaces,
                                          InvocationHandler h)

loader:被代理對象的classloader。
interfaces:被代理對象實現(xiàn)的接口。
h:invocation handler,用于分派執(zhí)行代理方法。

下面看下具體的代理實現(xiàn)demo:

public class ProxyTest {

    @Test
    public void proxyMethodTest() {
        ClientObject clientObject = new ClientObject();
        ClientObjectInterface object = (ClientObjectInterface) Proxy.newProxyInstance(
            clientObject.getClass().getClassLoader(), clientObject.getClass().getInterfaces(),
            new ObjectProxy());
        System.out.println(object.get());
    }

}

interface ClientObjectInterface {
    public String get ();
}

class ClientObject implements ClientObjectInterface {
    public String get () {
        return "hi";
    }
}


class ObjectProxy implements InvocationHandler {

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("methodName: " + method.getName());
        return "no hi";
    }
}

運行結(jié)果:
methodName: get
no hi

當然可以在代理對象里面做很多事情,本demo只是簡單的替換了被代理對象的函數(shù)體。

使用場景

代理的使用場景主要集中在,某一業(yè)務(wù)需要委托代理類集中處理某一業(yè)務(wù)然后再執(zhí)行具體的實現(xiàn)類的業(yè)務(wù)邏輯。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66113.html

相關(guān)文章

  • java動態(tài)代理及RPC框架介紹

    摘要:這種語法,在中被稱為動態(tài)代理。在動態(tài)代理機制中,這個角色只能是接口。動態(tài)代理就是實現(xiàn)的技術(shù)之一。 所謂動態(tài)代理,指的是語言提供的一種語法,能夠?qū)ο笾胁煌椒ǖ恼{(diào)用重定向到一個統(tǒng)一的處理函數(shù)中來。python重寫__getattr__函數(shù)能夠做到這一點,就連世界上最好的語言也提供稱為魔術(shù)方法的__call。這種語法除了能更好的實現(xiàn)動態(tài)代理外,還是RPC框架實現(xiàn)原理的一部分。 動態(tài)代理...

    2shou 評論0 收藏0
  • Java三種代理模式:靜態(tài)代理動態(tài)代理和cglib代理

    摘要:動態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實現(xiàn)接口,通過生成類字節(jié)碼實現(xiàn)代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...

    Kaede 評論0 收藏0
  • Java動態(tài)代理深度解析

    摘要:動態(tài)代理深度解析引言說起動態(tài)代理,很多人可能都沒有直接去使用過。因為的動態(tài)代理只能代理接口,而不能代理原始的類。接下來是真正壓軸的環(huán)節(jié),實現(xiàn)自己的動態(tài)代理類。 Java動態(tài)代理深度解析 引言 說起動態(tài)代理,很多人可能都沒有直接去使用過。但是只要用過Spring,那動態(tài)代理就是一個是個繞不過的坎,因為Spring的核心特性之一AOP就是基于動態(tài)代理來實現(xiàn)的,那么什么情況下需要用到動態(tài)代理...

    whinc 評論0 收藏0
  • Java代理設(shè)計模式(Proxy)的四種具體實現(xiàn):靜態(tài)代理動態(tài)代理

    摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調(diào)用的編譯期,動態(tài)的創(chuàng)建一個新的文件,然后動態(tài)編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設(shè)計模式(Proxy Design Pattern)一共有幾種實現(xiàn)方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...

    gclove 評論0 收藏0
  • 你真的完全了解Java動態(tài)代理嗎?看這篇就夠了

    摘要:動態(tài)地代理,可以猜測一下它的含義,在運行時動態(tài)地對某些東西代理,代理它做了其他事情。所以動態(tài)代理的內(nèi)容重點就是這個。所以下一篇我們來細致了解下的到底是怎么使用動態(tài)代理的。 之前講了《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》,本來打算下一篇講講Srping的AOP的,但是其中會涉及到Java的動態(tài)代理,所以先單獨一篇來了解下Java的動態(tài)代理到底是什么,Java是怎么實現(xiàn)它的。 ...

    haitiancoder 評論0 收藏0
  • Java中的動態(tài)代理

    摘要:要明白,動態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因為動態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態(tài)代理類對象。 動態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實類的對象實例,在重寫業(yè)務(wù)方法中通過調(diào)用真實...

    CastlePeaK 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<