簡體   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