Wo findet die Bytecode-Injektion statt?

Motivation

Ich habe einSomeObject.java Datei:

class SomeObject {
   String name;
}

Beim Kompilieren entsteht ein Bytecode-haltigerSomeObject.class Datei.

0xCAFEBABE...

Wenn wir SomeObject in der JVM verwenden, wird es vom aktuellen Klassenladeprogramm geladen und alles funktioniert einwandfrei.

Nehmen wir nun an, dass ich eine dynamische Codegenerierung haben möchte. Ich kann meine benutzerdefinierten Anmerkungen schreiben

@Target(ElementType.TYPE)
public @interface Data {
   ...
}

und füge es als Modifikator zur Klassendeklaration hinzu:

@Data
class SomeObject {
   String name;
}

Ich kann es auch zur Laufzeit mit behalten@Retention(RetentionPolicy.RUNTIME):

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Data {
   ...
}
Frage

Wo werden Anmerkungen für die Bytecode-Injektion verwendet? Fügt ein Klassenladeprogramm Bytecode ein, wenn die Klasse mit der entsprechenden, zur Laufzeit beibehaltenen Annotation geladen wird, wie in der folgenden Abbildung dargestellt:

source -(compile)-> bytecode -(classloader bytecode injection)-> injected bytecode -(classloading)-> JVM loaded bytecode   

Antworten auf die Frage(1)

Ihre Antwort auf die Frage