首頁 > 軟體

Java動態代理簡單介紹

2022-08-27 14:01:11

1.代理模式

當我們需要呼叫某個類(具體實現類)的方法時,不直接建立該類的物件,而是拿到該類的代理類物件,通過代理物件,呼叫具體實現類的功能。具體實現類和代理類都實現同樣的介面,並且代理類持有實現類的物件。這樣做在呼叫端和具體實現端,做了一層隔離,避免直接打交道。

代理模式在現實中也有很多類似的例子,比如我們買房租房,都得通過中介,這個中介就相當於代理。

2.靜態代理實現

1)定義介面:

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

2)具體實現類:

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)使用者端呼叫:

        //1.建立被代理物件
        Andy andy = new Andy();
        //2.建立代理物件,代理物件持有被代理物件的參照
        HouseProxy proxy = new HouseProxy(andy);
        //3.使用者端通過代理物件呼叫。
        proxy.sallHouse();

3.動態代理實現

  //1.被代理物件
        final Andy andy = new Andy();
        //2.建立動態代理,Java在執行時動態生成的。
        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 {
                //通過反射呼叫被代理物件的方法
                return method.invoke(andy, objects);
            }
        });
        //3.使用者端通過代理物件呼叫被代理方法。
        iHouse.sallHouse();

動態代理分析:

1)IHouse iHouse = (IHouse) Proxy.newProxyInstance();建立動態代理物件,

有三個引數:

1.ClassLoader 類載入器

2.被代理介面的Class類,

3.InvocationHandler介面實現類

2)拿到iHouse動態代理後,呼叫介面的方法iHouse.sallHouse();

這個方法一被呼叫,就會執行InvocationHandler類中invoke方法。

@Override

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

//通過反射呼叫被代理物件的方法

return method.invoke(andy, objects);

}

invoke方法有三個引數:

method,就是代理類呼叫的方法名(sallHouse)

objects,就是代理類呼叫方法時傳遞的引數。

Object obj = method.invoke(andy, objects); 通過反射機制 呼叫andy物件,具體實現者中對應的方法。

他的返回值,可以在代理物件呼叫介面時接收,是什麼型別,就返回什麼型別。Retrofit就是這樣做的

動態代理的原理是什麼?

分析原始碼

到此這篇關於Java動態代理簡單介紹的文章就介紹到這了,更多相關Java動態代理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com