私が働いている人は(スタックトレースで)-javaagent:spring-instrumentation.jarを使用してjvmを実行すると、JAXB注釈付きクラスに、私たちが記述しなかった奇妙な新しいメソッドがあることに気付きました。
これは、jaxbが利用可能なときにバイトコードインストルメンテーションを使用することを意味しますか?この機能の詳細はどこで読むことができますか?
ありがとう、ユヴァル
私が働いている人は(スタックトレースで)-javaagent:spring-instrumentation.jarを使用してjvmを実行すると、JAXB注釈付きクラスに、私たちが記述しなかった奇妙な新しいメソッドがあることに気付きました。
これは、jaxbが利用可能なときにバイトコードインストルメンテーションを使用することを意味しますか?この機能の詳細はどこで読むことができますか?
ありがとう、ユヴァル
スカフマンの投稿への追加:
表示されるもの (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/。