JAXB是否使用字节码检测?

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

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

谢谢,Yuval

只是skaffman的post的补充:

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

因此,JAXB参考实现并没有在修改现有类的意义上检测字节码,而是为优化的运行时性能生成新类。

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

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

编辑:我应该强调这是Sun JAXB参考实现的内容,它不是JAXB规范的一部分。 其他实现可以随意做任何选择。

最后我检查过,JAXB使用reflection根据你提供的XML生成类(虽然我有一段时间没有使用它,所以他们可能已经改变了他们的方法)。

我知道,另一方面, JiBX使用BCEL来执行字节码检测。 这是一篇关于它的文章: http : //www.ibm.com/developerworks/java/library/j-cwt09065/ 。

正如skaffman所提到的,您可以通过设置系统属性来关闭所有内部类的生成:com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.fastBoot = true

当然它没有记录,但多年来没有改变。