我工作的人注意到(在stacktrace中),在使用-javaagent运行JVM时:spring -instrumentation.jar我的jaxb我的jaxb注释类中有奇怪的新方法,我们没有写过:eg somejaxBannotatedClass $

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

谢谢,尤瓦尔

有帮助吗?

解决方案

只是Skaffman帖子的补充:

您看到的(somejaxbannotatedclass $ jaxbaccessor ...)是一个内类,它是由JAXB参考实现动态生成的。为了防止在运行时反射开销,该类的具体实现的字节码 com.sun.xml.bind.v2.runtime.reflect.Accessor 通过使用反射来绕过centercloction clundeclass方法的保护访问修饰符后,通过调用ClassLoader.defineclass(字符串,byte [],int,int)来生成并注入当前的classloader。

因此,jaxb参考实现不是在修改现有类的意义上,而是仪器字节码,而是生成新类以优化运行时性能。

其他提示

当。。。的时候 JaxbContext 启动时,它执行大量反射操作,以预先缓存以后需要的所有内容。这样做是出于绩效原因。我不确定它的确做什么,但是我希望它可以执行某种运行时的课堂生成逻辑,因为在运行时的速度比原始反射要快。

有趣的是,您可以通过设置未记录的系统属性来关闭此行为,该属性以运行时性能为代价,从而改善上下文的启动。

编辑: 我应该强调的是,这是Sun Jaxb参考实现在封面下的作用,而不是JAXB规格的一部分。其他实现可以自由地做他们选择的任何事情。

最后我检查了一下,JAXB使用反射来基于您提供的XML生成类(尽管我一定没有使用它,因此他们可能已经改变了方法)。

我知道 jibx, 另一方面,使用 Bcel 执行字节码仪器。这是一篇关于这一点的文章: http://www.ibm.com/developererworks/java/library/j-cwt09065/.

如Skaffman所述,您可以通过设置系统属性来关闭所有这些内部类的生成:com.sun.xml.internal.bind.v2.runtime.jaxbcontextimpl.fast.fastboot = true

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top