动机
我有一个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