Java反射機制剖析(四)-深度剖析動態代理原理及總結

來源:互聯網
上載者:User

動態代理類原理(範例程式碼參見java反射機制剖析(三))

a)  理解上面的動態代理樣本流程




b)  代理介面實作類別原始碼剖析


咱們一起來剖析一下代理實作類別($Proxy0)的原始碼和整個動態代理的流程。

$Proxy0產生的程式碼如下:

 import java.lang.reflect.InvocationHandler;<br />import java.lang.reflect.Method;<br />import java.lang.reflect.Proxy;<br />import java.lang.reflect.UndeclaredThrowableException;</p><p>public final class $Proxy0 extends Proxy implements Manager {</p><p>private static Method m1;<br />private static Method m0;<br />private static Method m3;<br />private static Method m2;</p><p>static {<br /> try {<br /> m1 = Class.forName("java.lang.Object").getMethod("equals",<br /> new Class[] { Class.forName("java.lang.Object") });<br /> m0 = Class.forName("java.lang.Object").getMethod("hashCode",<br /> new Class[0]);<br /> m3 = Class.forName("com.ml.test.Manager").getMethod("test",<br /> new Class[0]);<br /> m2 = Class.forName("java.lang.Object").getMethod("toString",<br /> new Class[0]);<br /> } catch (NoSuchMethodException nosuchmethodexception) {<br /> throw new NoSuchMethodError(nosuchmethodexception.getMessage());<br /> } catch (ClassNotFoundException classnotfoundexception) {<br /> throw new NoClassDefFoundError(classnotfoundexception.getMessage());<br /> }<br />}</p><p>public $Proxy0(InvocationHandler invocationhandler) {<br /> super(invocationhandler);<br />}</p><p>@Override<br />public final boolean equals(Object obj) {<br /> try {<br /> return ((Boolean) super.h.invoke(this, m1, new Object[] { obj }))<br /> .booleanValue();<br /> } catch (Throwable throwable) {<br /> throw new UndeclaredThrowableException(throwable);<br /> }<br />}</p><p>@Override<br />public final int hashCode() {<br /> try {<br /> return ((Integer) super.h.invoke(this, m0, null)).intValue();<br /> } catch (Throwable throwable) {<br /> throw new UndeclaredThrowableException(throwable);<br /> }<br />}</p><p>public final void test() {<br /> try {<br /> super.h.invoke(this, m3, null);<br /> return;<br /> } catch (Error e) {<br /> } catch (Throwable throwable) {<br /> throw new UndeclaredThrowableException(throwable);<br /> }<br />}</p><p>@Override<br />public final String toString() {<br /> try {<br /> return (String) super.h.invoke(this, m2, null);<br /> } catch (Throwable throwable) {<br /> throw new UndeclaredThrowableException(throwable);<br /> }<br />}<br />}

引入眼帘的是這個代理介面實作類別實現了業務類的介面(也就是例子中的UserManager介面),又繼承了基類Proxy類;

接著就是建構函式,在構造方法中把BusinessHandler傳過去,接著$Proxy0調用父類Proxy的構造器,為h賦值(這裡要看Proxy的構造方法);

隨後看到的就是這個類重寫了Proxy類的Equals、hashCode、toString方法,又實現了業務類介面的方法(即UserManager的test方法),具體重寫和實現都是用到的super.h.invoke(即Proxy.h.invoke)這個方法。

簡單分析完這個代理介面實作類別,咱們下面來整體看一下這個動態代理是怎麼實現的:


首先用戶端初始化了BusinessHandler類,調用這個類的newProxyInstance(new UserManagerImpl())方法來初始化了上面的代理介面實作類別;

接下來代理介面實作類別通過建構函式把BusinessHandler傳過去(也就是代碼中的this),並通過Proxy的建構函式給h賦值;

隨後再用戶端就能執行個體化出代理介面實作類別$Proxy0,我們把它強制轉換為業務實現介面(UserManager)類型的(為什麼要強制轉換,這裡非常有意思,如果不強制轉換就會報錯,這裡很好解釋,因為當前的環境根本不會知道這個代理介面實作類別$Proxy0既繼承Proxy又實現業務實現介面UserManager,但是強制轉換成UserManager它是可以做到的,因為當前環境中就有UserManager。這就是反射的厲害之處,可以在運行時動態調用任何一個類並可以使用這個類的具體細節。);

之後當我們調用test方法的時候其實是調用了$Proxy0中的test方法,這個方法的實現是通過Proxy.h的invoke方法實現的(即調用了BusinessHandler.invoke方法);

之後在調用了Method的invoke方法(這時的參數是this,和args)。

這樣就調用了UserManagerImpl的對應方法,之後返回給用戶端。


到此就完成了整個的調用關係。

       

反射,反射,程式員的快樂

通過上篇文章對動態代理進行了深度剖析,現在想起來還感覺非常有意思,這裡面其實最根本的機制就是反射機制,運行時動態執行個體化任何一個類,並且調用它的具體細節。現在反看動態代理的樣本,其實發現這裡最關鍵的還是在就在Proxy.newProxyInstance(..)方法執行時產生了$Proxy0的記憶體位元組碼這一點上,當我們有了記憶體位元組碼,我們的反射就會大顯威力,這樣才有了我們之後的一系列的調用關係。


通過反射機制的分析和動態代理樣本的剖析,發現編程是一件多麼有意思的事情,以至於我們沉浸其中不能自拔。


最後總結一下:反射,反射,程式員的快樂!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.