Onde ocorre a injeção de bytecode?
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ãoOnde 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