保留策略CLASS与运行时间

RetentionPolicy.CLASSRetentionPolicy.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上的例子让你玩。