在javaagent中通过反射构建一个对象,为什么Class.forName(className)不行,但是ClassLoader.loadClass(className)可以?

文章目录

  • 问题
  • 原因

问题

希望通过Javaagent在RabbitMq中传递参数,RabbitMq的核心方法传递的参数可能为null,如果为null需要手动构造一个实例添加进去。
手动构造的过程中为什么Class.forName(className)不行,但是ClassLoader.loadClass(className)可以?

原因

https://blog.csdn.net/dataiyangu/article/details/86321678
在javaagent中通过反射构建一个对象,为什么Class.forName(className)不行,但是ClassLoader.loadClass(className)可以?_第1张图片

Class.forName(className)装载的class已经被初始化,而
ClassLoader.loadClass(className)装载的class还没有被link。一般情况下,这两个方法效果一样,都能装载Class。但如果程序依赖于Class是否被初始化,就必须用Class.forName(name)了。

javaagent是在类加载进入jvm的时候注入进去的,而Class.forName(className)已经初始化完成了,所以不能在javaagent中使用这种方式构造。

你可能感兴趣的:(Work,problems❤️,JAVA❤️,#,JAVA,------,JavaAgent)