動機
私はSomeObject.java
ファイルを持っています:
class SomeObject {
String name;
}
コンパイルすると、バイトコードを含むSomeObject.class
ファイルが作成されます。
0xCAFEBABE...
JVM で SomeObject を使用すると、現在のクラスローダーによってロードされ、すべて正常に動作します。
ここで、動的コード生成が必要だと仮定しましょう。カスタム注釈を書くことができます
@Target(ElementType.TYPE)
public @interface Data {
...
}
クラス宣言に修飾子として追加します。
@Data
class SomeObject {
String name;
}
ランタイム用に保持することもできます@Retention(RetentionPolicy.RUNTIME)
:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Data {
...
}
質問
バイトコード インジェクションに使用される注釈はどこにありますか? 次の図のように、適切な実行時保持アノテーションを使用してクラスをロードするときに、クラスローダーはバイトコードを挿入しますか?
source -(compile)-> bytecode -(classloader bytecode injection)-> injected bytecode -(classloading)-> JVM loaded bytecode