保留策略CLASS与运行时间
RetentionPolicy.CLASS
和RetentionPolicy.RUNTIME
之间的实际区别是什么?
它看起来像都被logging到字节码中,并且无论如何都可以在运行时被访问。
无论如何都可以在运行时访问这两者。
这不是什么javadoc说:
RUNTIME:注解由编译器logging在类文件中,并在运行时由VM保留,所以它们可以reflection性地读取 。
CLASS:注解由编译器logging在类文件中,但不需要在运行时由VM保留 。
实际上,我不知道CLASS
的任何用例。 如果你想以编程的方式读取字节码,而不是通过类加载器API,这将是有用的,但这是一个非常特殊的情况,我不知道你为什么不使用RUNTIME
。
讽刺的是, CLASS
是默认行为。
它看起来像都被logging到字节码中,并且无论如何都可以在运行时被访问。
对于像getAnnotations
这样的基本的内置注解接口来说是getAnnotations
。 例如:
import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.CLASS) @interface RetentionClass {} @Retention(RetentionPolicy.RUNTIME) @interface RetentionRuntime {} public static void main(String[] args) { @RetentionClass class C {} assert C.class.getAnnotations().length == 0; @RetentionRuntime class D {} assert D.class.getAnnotations().length == 1; }
因此观察RetentionPolicy.CLASS
注释的唯一方法是使用字节码parsing器。
另一个区别是Retention.CLASS
注释类获取RuntimeInvisible类属性,而Retention.RUNTIME
注释获取RuntimeVisible类属性。 这可以用javap
来观察。
GitHub上的例子让你玩。