运行main方法,查看控制台,大功告成 。至此,我们已经完整的完成了一次动态代理的使用 。
动态代理的原理
生成的proxyInstance对象到底是什么,为什么调用它的sayHello方法会执行CustomerHandler的invoke方法呢?
直接贴上proxyInstance的字节码文件,我们就会恍然大悟了...
//$Proxy0是SaySomething的实现类,重写了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());}}//实现了接口的sayHello方法,在方法内部调用了CustomerHandler的invoke方法,同时传入了Method对象,//所以在CustomerHandler对象中可以通过mathod.invovke方法调用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 {//忽略内容}public final boolean equals(Object var1) throws {//忽略内容}public final String toString() throws {//忽略内容}}
看到了生成的代理对象的字节码文件,是不是一切都明白你了,原理竟然如此简单^_^
以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!
「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助:- Linux和Unix的那些事儿 UNIX和Linux
- 2 白酒起源探讨:李白一顿能喝4斤,他们唐朝人喝的到底是啥酒
- 丝瓜最好吃的简单做法 丝瓜怎么好吃又简单的做法
- 刷牙究竟能不能省心?100天一充的T9U电动牙刷使用体验
- 电动牙刷的正确使用方法 电动牙刷的正确使用方法图片
- 判断一条鱼的年龄 怎么判断一条鱼的年龄
- 多数情况下通过什么判断鱼的年龄 多数情况下通过什么来判断鱼的年龄
- 你知道怎么识别鱼的年龄吗 如何识别鱼的年龄
- 红玛瑙的魅力 什么样的红玛瑙
- 用鲑鱼精子制造的塑料替代品来了,可以被水回收