JDK動態代理爲何必須針對接口

動態代理其實是程序在運行中,java

  • 根據被代理的接口來動態生成代理類的class文件,
  • 並加載class文件運行的過程,
  • 經過反編譯被生成的$Proxy0.class文件發現
public final class $Proxy0 extends Proxy implements Interface {

    public $Proxy0(InvocationHandler paramInvocationHandler) {
        super(paramInvocationHandler);
    }

    // 該方法爲被代理接口的業務方法,代理類都會自動生成相應的方法,裏面去執行invocationHandler 的invoke方法。
    public final void sayHello(String paramString) {
        try {
            this.h.invoke(this, m3, new Object[] { paramString });
            return;
        }
        catch (Error|RuntimeException localError) {
            throw localError;
        }
        catch (Throwable localThrowable) {
            throw new UndeclaredThrowableException(localThrowable);
        }
    }
}
  • java是單繼承
    • 動態生成的代理類已經繼承了Proxy類的,就不能再繼承其餘的類,
    • 因此只能靠實現被代理類的接口的形式,故JDK的動態代理必須有接口。

爲什麼調用代理類的方法就會自動進入InvocationHandler 的 invoke()方法呢?this

  • 由於 invoke方法中利用jdk反射的方式去調用真正的被代理類的業務方法
  • 並且還能夠在方法的先後去加一些咱們自定義的邏輯
相關文章
相關標籤/搜索