RetentionPolicy.CLASS和之间有什么实际区别RetentionPolicy.RUNTIME?
看起来两者都记录在字节码中,无论如何都可以在运行时访问它们.
看起来两者都记录在字节码中,无论如何都可以在运行时访问。
对于基本的内置注释接口(如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;
}
Run Code Online (Sandbox Code Playgroud)
所以观察RetentionPolicy.CLASS注解的唯一方法是使用字节码解析器。
另一个区别是被Retention.CLASS注解的类得到一个RuntimeInvisible类属性,而Retention.RUNTIME注解得到一个RuntimeVisible类属性。这可以通过 观察到javap。
GitHub 上的示例供您使用。