Instrumentation API のドキュメントと Web にある多数の例を読んでいます。しかし、まだインストルメンテーション API を使用してクラスにどのようなことができるのか理解できませんか? クラスがロードされる前に、必要な変換 (新しいフィールドの追加、削除、メソッドの追加) を行うことができますが、ロードされると、メソッド本体の変更のみが許可されると考えるのは正しいですか?
ありがとう。
Instrumentation API のドキュメントと Web にある多数の例を読んでいます。しかし、まだインストルメンテーション API を使用してクラスにどのようなことができるのか理解できませんか? クラスがロードされる前に、必要な変換 (新しいフィールドの追加、削除、メソッドの追加) を行うことができますが、ロードされると、メソッド本体の変更のみが許可されると考えるのは正しいですか?
ありがとう。
どのような変更が許可されるかは、JVM によって異なります。通常、パブリック API とすべてのフィールドを同じに保つ必要があります。コードを変更できます。
http://docs.oracle.com/javase/7/docs/api/java/lang/instrument/Instrumentation.html#retransformClasses%28java.lang.Class...%29から
再変換により、メソッド本体、定数プール、および属性が変更される場合があります。再変換では、フィールドやメソッドの追加、削除、名前変更、メソッドのシグネチャの変更、または継承の変更を行ってはなりません。これらの制限は、将来のバージョンで解除される可能性があります。クラス ファイルのバイトは、変換が適用されるまでチェック、検証、およびインストールされません。結果のバイトにエラーがある場合、このメソッドは例外をスローします。