您的位置首页百科问答

javaAPI元注解之Inherited

javaAPI元注解之Inherited

的有关信息介绍如下:

javaAPI元注解之Inherited

首先这个注解是javaAPI四个元注解之一,用于修饰注解,位于java.lang.annotation包下。

Inherited是遗传的意思,看到这个东西有点蒙圈。且看源码注释,用我粗糙的英语翻译一下:指明一个注解类型自动遗传(言外之意注解不会自动遗传)。

如果一个Inherited元注解出现在了一个注解A的声明处,用户在这个类的声明上查询此注解类型A,并且这个类的声明中没有要查询的注解类型A,然后就会自动的去查询此类的父类,这个过程一直重复,直到找到为止,或者到达Object类。如果在所有的父类中都找不到这个类型的注解,这个查询就会指明这个类没有此注解。

注意,被这个元注解修饰的注解对非类的元素无效(言外之意,被此元注解修饰的注解的遗传作用只对类有效)。也要注意,这种元注解仅仅使注解遗传自父类们(复数)。

其实一句话,就是,被Inherited修饰的注解,并且此注解用于修饰类,会自动遗传给其子类。

先看注解的声明:

(1)Documented:生成API帮助文档时显示注解。

(2)Retention:jvm保留。

(3)Target:此注解是元注解。

再看一个例子:创建三个注解,两个注解用Inherited声明,一个没有声明。并且三个注解必须要有Retention=RUNTIME,否则jvm不认识,请看:Retention。

创建测试类和四个有继承关系的类。getAnnotations查找类的注解,并输出获取到的注解个数。

再来看一下Deprecated注解的声明,并没有声明Inherited。

查看输出,Son1类只有一个注解MyInheritedAnnotation2。为什么哪?

看这个继承的关系,Son1继承了Father1,Father1继承了GrandFather,GrandFather继承了Monkey,Monkey继承了Object。

Object类没有注解;

Monkey有一个注解Deprecated,但是Deprecated注解没有声明Inherited,所以没有注解遗传给GrandFather。

GrandFather有一个注解MyInheritedAnnotation3,但是MyInheritedAnnotation3没有声明Inherited,所以不会遗传,GrandFather也没有从Monkey继承到注解,所以GrandFather没有注解遗传给Father1;

Father1有一个注解MyInheritedAnnotation2,MyInheritedAnnotation2声明了Inherited,所以会遗传给Son1;Father1没有从GrandFather继承到注解。

Son1本身没有注解,但是从其父类Father1继承到了MyInheritedAnnotation2,所以其有一个注解MyInheritedAnnotation2。

注意一点:Son1.class.getAnnotations();获取的是类的注解,方法等其他元素的注解不会包括在内,所以MyInheritedAnnotation1没有输出。