我工作的人注意到(在stacktrace中)当使用-javaagent:spring-instrumentation.jar运行jvm时,我的JAXB注释类中有奇怪的新方法,我们没有编写: SomeJaxbAnnotatedClass $ JaxbAccessorM_getFields_setFields_java_util_Set.get

这是否意味着jaxb在可用时使用字节码检测?在哪里可以阅读有关此功能的更多信息?

谢谢,
尤瓦尔

最佳答案

只是skaffman帖子的补充:

您看到的(SomeJaxbAnnotatedClass $ JaxbAccessor ...)是一个内部类,它是由JAXB参考实现动态生成的。为了防止在运行时产生反射开销,在使用反射规避受保护的访问修饰符之后,通过调用ClassLoader.defineClass(String,byte [],int,int)来生成用于类com.sun.xml.bind.v2.runtime.reflect.Accessor的具体实现的字节码,并将其注入当前的类加载器中。 defineClass方法。

因此,JAXB参考实现并不是在修改现有类的情况下检测字节码,而是生成新类以优化运行时性能。

07-24 09:38
查看更多