JAXB是否使用字节码检测?

Yuv*_*mar 8 java jaxb bytecode-manipulation

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

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

谢谢,Yuval

jar*_*bjo 12

只是skaffman的帖子的补充:

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

因此,JAXB参考实现并不是在修改现有类,而是生成用于优化运行时性能的新类.


ska*_*man 8

JaxbContext启动时,它执行了大量的反射操作,预先缓存所有的东西,它会在以后需要.这是出于性能原因而完成的.我不确定它到底做了什么,但我希望它能够执行某种运行时类生成逻辑,因为在运行时它比原始反射更快.

有趣的是,您可以通过设置未记录的系统属性来关闭此行为,这会改善上下文的启动,但会牺牲运行时性能.

编辑:我应该强调这是Sun JAXB参考实现的内容,它不是JAXB规范的一部分.其他实现可以自由选择.