我正在尝试查找使用自定义注释注释的所有字段,但它似乎没有检测到它。相同的代码适用于标准注释,例如@Deprecated。
要重现的最小代码:
public class MyClass {
public @interface MyAnnotation {}
@MyAnnotation Object someObject;
@MyAnnotation @Deprecated Object someDeprecatedObject;
@Deprecated Object aThirdObject;
public static void main(String[] args) {
Class<?> cls = MyClass.class;
for (Field field : cls.getDeclaredFields()) {
System.out.print(field.getName());
for (Annotation a : field.getDeclaredAnnotations())
System.out.print(" " + a);
System.out.println();
}
}
}
输出:
someObject
someDeprecatedObject @java.lang.Deprecated()
aThirdObject @java.lang.Deprecated()
@Deprecated出现了,但是@MyAnnotation却没有!救命啊!
答案 0 :(得分:5)
默认情况下,注释不会保留在运行时,因此无法反映。您需要声明这样的注释,以确保它在运行时存在:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}