JDK中如何解析ProxyGenerator生成代理类的字节码文件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。通过前面几篇的分析,我们知道代理类是通过Proxy类的ProxyClassFactory工厂生成的,这个工厂类会去调用ProxyGenerator类的generateProxyClass()方法来生成代理类的字节码。ProxyGenerator这个类存放在sun.misc包下,我们可以通过OpenJDK源码来找到这个类,该类的generateProxyClass()静态方法的核心内容就是去调用generateClassFile()实例方法来生成Class文件。我们直接来看generateClassFile()这个方法内部做了些什么。
可以看到generateClassFile()方法是按照Class文件结构进行动态拼接的。什么是Class文件呢?在这里我们先要说明下,我们平时编写的Java文件是以.java结尾的,在编写好了之后通过编译器进行编译会生成.class文件,这个.class文件就是Class文件。Java程序的执行只依赖于Class文件,和Java文件是没有关系的。这个Class文件描述了一个类的信息,当我们需要使用到一个类时,Java虚拟机就会提前去加载这个类的Class文件并进行初始化和相关的检验工作,Java虚拟机能够保证在你使用到这个类之前就会完成这些工作,我们只需要安心的去使用它就好了,而不必关心Java虚 香港云主机拟机是怎样加载它的。当然,Class文件并不一定非得通过编译Java文件而来,你甚至可以直接通过文本编辑器来编写Class文件。在这里,JDK动态代理就是通过程序来动态生成Class文件的。我们再次回到上面的代码中,可以看到,生成Class文件主要分为三步:第一步:收集所有要生成的代理方法,将其包装成ProxyMethod对象并注册到Map集合中。第二步:收集所有要为Class文件生成的字段信息和方法信息。第三步:完成了上面的工作后,开始组装Class文件。我们知道一个类的核心部分就是它的字段和方法。我们重点聚焦第二步,看看它为代理类生成了哪些字段和方法。在第二步中,按顺序做了下面四件事。1.为代理类生成一个带参构造器,传入InvocationHandler实例的引用并调用父类的带参构造器。2.遍历代理方法Map集合,为每个代理方法生成对应的Method类型静态域,并将其添加到fields集合中。3.遍历代理方法Map集合,为每个代理方法生成对应的MethodInfo对象,并将其添加到methods集合中。4.为代理类生成静态初始化方法,该静态初始化方法主要是将每个代理方法的引用赋值给对应的静态字段。通过以上分析,我们可以大致知道JDK动态代理最终会为我们生成如下结构的代理类:
至此,经过层层分析,深入探究JDK源码,我们还原了动态生成的代理类的本来面目,之前心中存在的一些疑问也随之得到了很好的解释1.代理类默认继承Porxy类,因为Java中只支持单继承,所以JDK动态代理只能去实现接口。2.代理方法都会去调用InvocationHandler的invoke()方法,因此我们需要重写InvocationHandler的invoke()方法。3.调用invoke()方法时会传入代理实例本身,目标方法和目标方法参数。解释了invoke()方法的参数是怎样来的。使用刚刚构造出来的Proxy0作为代理类再次进行测试,可以看到最终的结果与使用JDK动态生成的代理类的效果是一样的。再次验证了我们的分析是可靠且准确的。看完上述内容,你们掌握JDK中如何解析ProxyGenerator生成代理类的字节码文件的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注开发云行业资讯频道,感谢各位的阅读!
这篇文章主要介绍“Windows中Git搭建的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Windows中Git搭建的方法”文章能帮助大家解决问题。1)下载 git用户端安装包2)运行安装包,打开 “使用许可公告…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。