JDK動態代理為什么必須針對接口


查看jdk的動態代理源碼發現:
動態代理實際上是程序在運行中,根據被代理的接口來動態生成代理類的class文件,並加載class文件運行的過程,通過反編譯被生成的$Proxy0.class文件發現:
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()方法呢?
其實是因為在動態代理類的定義中,構造函數是含參的構造,參數就是我們invocationHandler 實例,而每一個被代理接口的方法都會在代理類中生成一個對應的實現方法,並在實現方法中最終調用invocationHandler 的invoke方法,這就解釋了為何執行代理類的方法會自動進入到我們自定義的invocationHandler的invoke方法中,然后在我們的invoke方法中再利用jdk反射的方式去調用真正的被代理類的業務方法,而且還可以在方法的前后去加一些我們自定義的邏輯。比如切面編程AOP等。

 

 

補充說明,如果在實現類中,接口定義的方法互相調用不會在調用InvocationHandler的invoke方法,JDK動態代理應該不是嵌入到Java的反射機制中,而是在反射機制上的一個調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM