運(yùn)行main方法,查看控制臺,大功告成 。至此,我們已經(jīng)完整的完成了一次動態(tài)代理的使用 。
動態(tài)代理的原理
生成的proxyInstance對象到底是什么,為什么調(diào)用它的sayHello方法會執(zhí)行CustomerHandler的invoke方法呢?
直接貼上proxyInstance的字節(jié)碼文件,我們就會恍然大悟了...
//$Proxy0是SaySomething的實現(xiàn)類,重寫了sayHello和sayBye方法public final class $Proxy0 extends Proxy implements SaySomething {private static Method m1;private static Method m3;private static Method m2;private static Method m4;private static Method m0;public $Proxy0(InvocationHandler var1) throws {super(var1);}static {try {m1 = Class.forName("java.lang.Object").getMethod("equals", Class.forName("java.lang.Object"));m3 = Class.forName("com.example.demo.hanmc.proxy.jdk.SaySomething").getMethod("sayHello");m2 = Class.forName("java.lang.Object").getMethod("toString");m4 = Class.forName("com.example.demo.hanmc.proxy.jdk.SaySomething").getMethod("sayBye");m0 = Class.forName("java.lang.Object").getMethod("hashCode");} catch (NoSuchMethodException var2) {throw new NoSuchMethodError(var2.getMessage());} catch (ClassNotFoundException var3) {throw new NoClassDefFoundError(var3.getMessage());}}//實現(xiàn)了接口的sayHello方法,在方法內(nèi)部調(diào)用了CustomerHandler的invoke方法,同時傳入了Method對象,//所以在CustomerHandler對象中可以通過mathod.invovke方法調(diào)用SyaSomthing的sayHello方法public final void sayHello() throws {try {//h是父類Proxy中的InvocationHandler對象,其實就是我們自定義的CustomHandler對象super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final void sayBye() throws {try {super.h.invoke(this, m4, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}}public final int hashCode() throws {//忽略內(nèi)容}public final boolean equals(Object var1) throws {//忽略內(nèi)容}public final String toString() throws {//忽略內(nèi)容}}
看到了生成的代理對象的字節(jié)碼文件,是不是一切都明白你了,原理竟然如此簡單^_^
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- Linux和Unix的那些事兒 UNIX和Linux
- 2 白酒起源探討:李白一頓能喝4斤,他們唐朝人喝的到底是啥酒
- 絲瓜最好吃的簡單做法 絲瓜怎么好吃又簡單的做法
- 刷牙究竟能不能省心?100天一充的T9U電動牙刷使用體驗
- 電動牙刷的正確使用方法 電動牙刷的正確使用方法圖片
- 判斷一條魚的年齡 怎么判斷一條魚的年齡
- 多數(shù)情況下通過什么判斷魚的年齡 多數(shù)情況下通過什么來判斷魚的年齡
- 你知道怎么識別魚的年齡嗎 如何識別魚的年齡
- 紅瑪瑙的魅力 什么樣的紅瑪瑙
- 用鮭魚精子制造的塑料替代品來了,可以被水回收
