Onde ocorre a injeção de bytecode?

Motivação

eu tenho umSomeObject.java Arquivo:

class SomeObject {
   String name;
}

Compilar cria um bytecode contendoSomeObject.class Arquivo.

0xCAFEBABE...

Se usarmos o SomeObject na JVM, ele será carregado pelo carregador de classes atual e tudo funcionará bem.

Agora vamos supor que eu gostaria de ter alguma geração de código dinâmico. Posso escrever minha anotação personalizada

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

e adicione-o como um modificador à declaração de classe:

@Data
class SomeObject {
   String name;
}

Eu também posso retê-lo para o tempo de execução com@Retention(RetentionPolicy.RUNTIME):

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Data {
   ...
}
Questão

Onde as anotações são usadas para injeção de bytecode? Um carregador de classe injeta bytecode ao carregar a classe com a anotação retida em tempo de execução apropriada, como nesta figura:

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

questionAnswers(1)

yourAnswerToTheQuestion