欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java動(dòng)態(tài)代理簡(jiǎn)單介紹

 更新時(shí)間:2022年08月27日 09:16:38   作者:niuyongzhi  
動(dòng)態(tài)代理指的是,代理類和目標(biāo)類的關(guān)系在程序運(yùn)行的時(shí)候確定的,客戶通過代理類來調(diào)用目標(biāo)對(duì)象的方法,是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)的創(chuàng)建目標(biāo)類的代理對(duì)象。本文將通過案例詳細(xì)講解一下Java動(dòng)態(tài)代理的原理及實(shí)現(xiàn),需要的可以參考一下

1.代理模式

當(dāng)我們需要調(diào)用某個(gè)類(具體實(shí)現(xiàn)類)的方法時(shí),不直接創(chuàng)建該類的對(duì)象,而是拿到該類的代理類對(duì)象,通過代理對(duì)象,調(diào)用具體實(shí)現(xiàn)類的功能。具體實(shí)現(xiàn)類和代理類都實(shí)現(xiàn)同樣的接口,并且代理類持有實(shí)現(xiàn)類的對(duì)象。這樣做在調(diào)用端和具體實(shí)現(xiàn)端,做了一層隔離,避免直接打交道。

代理模式在現(xiàn)實(shí)中也有很多類似的例子,比如我們買房租房,都得通過中介,這個(gè)中介就相當(dāng)于代理。

2.靜態(tài)代理實(shí)現(xiàn)

1)定義接口:

public interface IHouse {
    void sallHouse();
    int sallHouse2();
}

2)具體實(shí)現(xiàn)類:

public class Andy implements IHouse {
    @Override
    public void sallHouse() {
        System.out.println("andy sall house..");
    }
    @Override
    public int sallHouse2() {
        return 100;
    }
}

3)代理類:

public class HouseProxy implements IHouse {
    Andy andy;
    public HouseProxy(Andy andy) {
        this.andy = andy;
    }
    @Override
    public void sallHouse() {
        andy.sallHouse();
    }
    @Override
    public int sallHouse2() {
        return andy.sallHouse2();
    }
}

4)客戶端調(diào)用:

        //1.創(chuàng)建被代理對(duì)象
        Andy andy = new Andy();
        //2.創(chuàng)建代理對(duì)象,代理對(duì)象持有被代理對(duì)象的引用
        HouseProxy proxy = new HouseProxy(andy);
        //3.客戶端通過代理對(duì)象調(diào)用。
        proxy.sallHouse();

3.動(dòng)態(tài)代理實(shí)現(xiàn)

  //1.被代理對(duì)象
        final Andy andy = new Andy();
        //2.創(chuàng)建動(dòng)態(tài)代理,Java在運(yùn)行時(shí)動(dòng)態(tài)生成的。
        ClassLoader classLoader = andy.getClass().getClassLoader();
        Class[] interfaces = andy.getClass().getInterfaces();
        IHouse iHouse = (IHouse) Proxy.newProxyInstance(classLoader, interfaces, new             InvocationHandler() {
            @Override
            public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                //通過反射調(diào)用被代理對(duì)象的方法
                return method.invoke(andy, objects);
            }
        });
        //3.客戶端通過代理對(duì)象調(diào)用被代理方法。
        iHouse.sallHouse();

動(dòng)態(tài)代理分析:

1)IHouse iHouse = (IHouse) Proxy.newProxyInstance();創(chuàng)建動(dòng)態(tài)代理對(duì)象,

有三個(gè)參數(shù):

1.ClassLoader 類加載器

2.被代理接口的Class類,

3.InvocationHandler接口實(shí)現(xiàn)類

2)拿到iHouse動(dòng)態(tài)代理后,調(diào)用接口的方法iHouse.sallHouse();

這個(gè)方法一被調(diào)用,就會(huì)執(zhí)行InvocationHandler類中invoke方法。

@Override

public Object invoke(Object o, Method method, Object[] objects) throws Throwable {

//通過反射調(diào)用被代理對(duì)象的方法

return method.invoke(andy, objects);

}

invoke方法有三個(gè)參數(shù):

method,就是代理類調(diào)用的方法名(sallHouse)

objects,就是代理類調(diào)用方法時(shí)傳遞的參數(shù)。

Object obj = method.invoke(andy, objects); 通過反射機(jī)制 調(diào)用andy對(duì)象,具體實(shí)現(xiàn)者中對(duì)應(yīng)的方法。

他的返回值,可以在代理對(duì)象調(diào)用接口時(shí)接收,是什么類型,就返回什么類型。Retrofit就是這樣做的

動(dòng)態(tài)代理的原理是什么?

分析源碼

到此這篇關(guān)于Java動(dòng)態(tài)代理簡(jiǎn)單介紹的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA 多線程爬蟲實(shí)例詳解

    JAVA 多線程爬蟲實(shí)例詳解

    這篇文章主要介紹了JAVA 多線程爬蟲實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • JAVA開發(fā)環(huán)境搭建教程

    JAVA開發(fā)環(huán)境搭建教程

    這篇文章主要為大家詳細(xì)介紹了JAVA開發(fā)環(huán)境搭建教程,配置JAVA開發(fā)環(huán)境,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java基礎(chǔ)教程之組合(composition)

    Java基礎(chǔ)教程之組合(composition)

    這篇文章主要介紹了Java基礎(chǔ)教程之組合(composition),組合是在Java中實(shí)現(xiàn)程序復(fù)用(reusibility)的基本手段之一,需要的朋友可以參考下
    2014-08-08
  • 詳解Java中Thread 和Runnable區(qū)別

    詳解Java中Thread 和Runnable區(qū)別

    這篇文章主要介紹了Java中Thread 和Runnable的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • springboot配置http跳轉(zhuǎn)https的過程

    springboot配置http跳轉(zhuǎn)https的過程

    SSL是為網(wǎng)絡(luò)通信提供安全以及保證數(shù)據(jù)完整性的的一種安全協(xié)議,SSL在網(wǎng)絡(luò)傳輸層對(duì)網(wǎng)絡(luò)連接進(jìn)行加密,這篇文章主要介紹了springboot配置http跳轉(zhuǎn)https的過程,需要的朋友可以參考下
    2023-04-04
  • 淺談JVM系列之從匯編角度分析NullCheck

    淺談JVM系列之從匯編角度分析NullCheck

    在virtual call中執(zhí)行nullcheck的時(shí)候,如果已經(jīng)知道傳遞的參數(shù)是非空的。JIT會(huì)對(duì)代碼進(jìn)行優(yōu)化嗎?本文將詳細(xì)介紹JVM系列之從匯編角度分析NullCheck。
    2021-06-06
  • Tornadofx學(xué)習(xí)筆記之IconTextFx開源庫(kù)整合5000+個(gè)字體圖標(biāo)

    Tornadofx學(xué)習(xí)筆記之IconTextFx開源庫(kù)整合5000+個(gè)字體圖標(biāo)

    這篇文章主要介紹了Tornadofx學(xué)習(xí)筆記之IconTextFx開源庫(kù)整合5000+個(gè)字體圖標(biāo)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • java異步編程的7種實(shí)現(xiàn)方式小結(jié)

    java異步編程的7種實(shí)現(xiàn)方式小結(jié)

    異步處理的實(shí)現(xiàn)方式有很多種,常見多線程,消息中間件,發(fā)布訂閱的廣播模式,本文就詳細(xì)的介紹java異步編程的7種實(shí)現(xiàn)方式,感興趣的可以了解一下
    2023-03-03
  • 詳解Spring Boot中Controller用法

    詳解Spring Boot中Controller用法

    Controller是SpringBoot里最基本的組件,他的作用是把用戶提交來的請(qǐng)求通過對(duì)URL的匹配,分配個(gè)不同的接收器,再進(jìn)行處理,然后向用戶返回結(jié)果。下面通過本文給大家介紹Spring Boot中Controller用法,需要的朋友參考下
    2017-05-05
  • Java實(shí)現(xiàn)局域網(wǎng)聊天小程序

    Java實(shí)現(xiàn)局域網(wǎng)聊天小程序

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)局域網(wǎng)聊天小程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論