基于JDK的动态代理原理分析 jdk动态代理底层原理( 二 )




运行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小编还为您精选了以下内容,希望对您有所帮助: