Java動態代理簡單介紹

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動態代理內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: