恰恰相反。getDeclaredAnnotations()
- 正如文档所说 - 是唯一忽略继承注释的方法。
以下是演示差异的片段:
public class Test1 {
public static void main(String[] args) {
Test3 test = new Test3();
for (Annotation annotation : test.getClass().getAnnotations()) {
System.out.println("Class getAnnotations: " + annotation);
}
for (Annotation annotation : test.getClass().getDeclaredAnnotations()) {
System.out.println("Class getDeclaredAnnotations: " + annotation);
}
for (Field field : test.getClass().getFields()) {
for (Annotation annotation : field.getAnnotations()) {
System.out.println("Field getAnnotations: " + annotation);
}
for (Annotation annotation : field.getDeclaredAnnotations()) {
System.out.println("Field getDeclaredAnnotations: " + annotation);
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@interface CustomAnnotation {
String value();
}
@CustomAnnotation("Class")
class Test2 {
@CustomAnnotation("Field") public String testString;
}
class Test3 extends Test2 {}
输出将是`getAnnotations:
Class getAnnotations: @test.CustomAnnotation(value=Class)
Field getAnnotations: @test.CustomAnnotation(value=Field)
Field getDeclaredAnnotations: @test.CustomAnnotation(value=Field)
您会看到Class getDeclaredAnnotations()
是空的,因为 Test3 类本身没有注释,只有从 Test2 继承的注释。
来自@Inherited 的Javadoc:
指示注释类型是自动继承的。如果注解类型声明中存在 Inherited 元注解,并且用户在类声明上查询注解类型,并且类声明没有该类型的注解,则将自动查询该类的超类以获取注解类型。将重复此过程,直到找到此类型的注释,或到达类层次结构(对象)的顶部。如果没有超类具有此类型的注释,则查询将指示所讨论的类没有此类注释。请注意,如果注释类型用于注释类以外的任何内容,则此元注释类型无效。另请注意,此元注释仅导致注释从超类继承;