Jaxbはbytecodeインストゥルメンテーションを使用しますか?
-
22-09-2019 - |
質問
私が働いている人は、jvmを-javaagent:spring -instrument.jarを使用してJVMを実行するときに(Stacktraceで)気づいたことに気付きました。
これは、JaxBが利用可能なときにByteCodeインストゥルメンテーションを使用することを意味しますか?この機能の詳細はどこで読むことができますか?
ありがとう、ユバル
解決
Skaffmanの投稿への追加:
あなたが見るもの(somejaxbannotatedclass $ jaxbaccessor ...)は内側のクラスであり、Jaxb参照実装によって動的に生成されます。実行時に反射オーバーヘッドを防ぐために、クラスの具体的な実装のバイトコード com.sun.xml.bind.v2.runtime.reflect.Accessor
Reflectionを使用してRefideClassメソッドの保護されたアクセス修飾子を回避した後、ClassLoader.DefineClass(String、Byte []、Int、Int)を呼び出すことにより、生成され、現在のクラスローダーに注入されます。
したがって、JAXBリファレンスの実装は、既存のクラスを変更しているという意味でバイトコードを計測するのではなく、最適化されたランタイムパフォーマンスのために新しいクラスを生成します。
他のヒント
いつ JaxbContext
起動し、大量の反射操作を実行し、後で必要なすべてのものを事前にキャッシュします。これは、パフォーマンス上の理由で行われます。それが正確に何をするのかはわかりませんが、それが生の反射よりもランタイムでより速くなるので、何らかのランタイムクラスの生成ロジックを実行することを期待するでしょう。
興味深いことに、ランタイムのパフォーマンスを犠牲にしてコンテキストのスタートアップを改善する非文書化されたシステムプロパティを設定することで、この動作をオフにすることができます。
編集: これがカバーの下でSun Jaxbリファレンス実装が行うことであり、Jaxb Specの一部ではないことを強調する必要があります。他の実装は、選択したものは何でも自由に行うことができます。
最後にチェックしましたが、JaxBはリフレクションを使用して、提供するXMLに基づいてクラスを生成します(しばらくして使用していませんが、方法論を変更した可能性があります)。
そんなこと知ってる Jibx, 、一方で、使用します bcel bytecode計装を実行します。これについての記事は次のとおりです。 http://www.ibm.com/developerworks/java/library/j-cwt09065/.
Skaffmanが述べたように、システムプロパティを設定することにより、これらすべての内部クラスの生成をオフにすることができます:com.sun.xml.internal.bind.v2.runtime.jaxbcontextimpl.fastboot = true
もちろん、それは文書化されていませんが、何年も変わっていません。