java動態代理的理解

靜態代理

public class TargetClass{
    void method1()
}

public class ProxyClass{
    private TargetClass target;
    
    public void method1(){
        target.method1()
    }
}
  • 代理類持有目標類的引用

動態代理

public interface TargetIntf{
    void method1();
}

public DynamicProxy implements InvocationHandler{
    @Override
    public Object invoke(Object o, Method method, Object[] args){
        //do proxy
    }
}

InvocationHandler handler = new DynamicProxy();
Proxy theProxy = (TargetIntf)Proxy.newInstance(hander.getClass().getClassLoader(), new Class[]{TargetIntf.class}, handler);
theProxy.method1()
  • 要有接口
  • 要實現InocationHandler
  • 經過Proxy.newInstance來生成代理類
  • 經過強轉取得目標類的實例

如何理解動態代理

當調用theProxy的method1時,會觸發handler.invoke方法的調用,方法(Method)和參數都會傳遞給invoke方法,invoke方法裏面想作什麼都行。java

爲何Proxy.newInstance能夠強轉成TargetIntf呢?

Proxy.newInstance返回的對象實現了TargetIntf接口的方法,因此能夠強轉。編程

爲何調用proxy的method1方法會調用到handler的invoke方法?

Proxy.newInstance返回的對象組合了handler,並在method1方法的實現邏輯中添加了handler.invoke的調用。api

Proxy.newInstance如何動態的實現TargetIntf的方法並返回對象實例呢?

動態的生成class文件,java類的信息都是從class文件加載進來的,Proxy.newInstance方法中動態的生成了class文件並加載。網絡

動態代理能幹嗎?

  • 提供了另一種實現接口的方式,不用implements也能實現接口。
  • 能夠用來寫框架

試想一下,若是沒有動態代理,dubbo框架如何實現?框架

動態代理的dubbo實現:ide

  • client和server端都依賴api的接口
  • client端不實現api接口,經過動態代理,把api接口調用鏈接到Invocation.invoke方法上,在此方法中將對象、方法名、參數等經過網絡發送給server端
  • server端實現api的接口,把client端發送過來的rpc調用鏈接到api接口的具體實現上。

沒有動態代理的實現:工具

  • client和server端都依賴api接口
  • client端實現api接口,接口的實現邏輯爲把對象、方法名、參數等經過網絡發送給server端
  • server端實現api的接口,把client端發送過來的rpc調用鏈接到api接口的具體實現上。

有了動態代理,dubbo rpc中的網絡交互部分能夠徹底寫在dubbo框架中,對用戶來講編程更加方便。
沒有動態代理,client端的api實現代碼也能夠經過工具自動生成,不過這樣讓框架使用起來更加的複雜。代理

相關文章
相關標籤/搜索