RetentionPolicy.SOURCE
:放弃期间 编译。这些注释并不适用 在编译之后有意义 完成了,所以他们没有写到 字节码。
示例:@Override
,@SuppressWarnings
如果以下注释名为MyAnno
未写入字节码(.class文件),如何在运行时访问它?实施例。
@Retention(RetentionPolicy.SOURCE)
@interface MyAnno {
int a = 4;
int val();
}
public class Example {
public static void test() {
System.out.println("MyAnno.a = " + MyAnno.a);
MyAnno myAnno = new MyAnno() {
public int val() {
return 7;
}
public Class<? extends Annotation> annotationType() {
return null;
}
};
System.out.println("myAnno.val = " + myAnno.val());
Override ov = new Override() {
public Class<? extends Annotation> annotationType() {
return null;
}
};
}
public static void main(String[] args) {
test();
}
}
以上代码正在运行,没有任何错误。
答案 0 :(得分:3)
RetentionPolicy是关于类的类文件,您在其中添加了注释,而不是注释本身的类文件,例如:
@MyAnno
public class TestClass {}
RetentionPolicy.SOURCE
表示如果您将注释添加到类中,然后尝试使用TestClass.class.getAnnotations()
获取该类的所有注释,则它不会成为结果的一部分。
答案 1 :(得分:2)
你误解了RetentionPolicy
的目的:它指的是你的类型注释会发生什么,而不是类型本身。
Documentation声明如下:
仅当元注释类型直接用于注释时,保留元注释才有效。如果元注释类型在另一个注释类型中用作成员类型,则无效。
您的程序直接使用元注释类型MyAnno
,而不是将其用于注释。因此,保留策略注释无效。