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!
推薦閱讀:
- Java的動態代理和靜態代理詳解
- 一文瞭解Java動態代理的原理及實現
- 解析動態代理jdk的Proxy與spring的CGlib(包括區別介紹)
- 帶你深入瞭解java-代理機制
- Java設計模式之代理模式詳解