【发布时间】:2019-04-04 05:19:32
【问题描述】:
动机
我有一个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
【问题讨论】:
-
这是一个非常有趣的问题@ipavlic!如果有人可以提供有关 Spring + AOP 内部的文献链接,将不胜感激。我想编写自己的注入代码的 Spring 注释。
标签: annotations classloader bytecode bytecode-manipulation