繁体   English   中英

JAXB是否使用字节码检测?

[英]Does JAXB use bytecode instrumentation?

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

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

谢谢,Yuval

只是skaffman的帖子的补充:

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM