所谓元注解就是作用于其他注解的注解。jdk1.5时定义了4个元注解,jdk1.8增加了@Repeatable注解。 下面一一介绍:
(1)@Target:定义注解作用范围,值是ElementType的枚举数组,可以是作用于类,方法,字段,参数等。元注解的Target是ANNOTATION_TYPE,表明是作用于注解上的
(2)@Retention:定义注解保留范围,有3个枚举值:
RetentionPolicy.SOURCE:只在编译期可以感知,不会在class文件留存
RetentionPolicy.CLASS:class文件会留存,但不会在虚拟机运行时感知,即在运行时无法通过反射获取注解信息
RetentionPolicy.RUNTIME:在运行时也能被虚拟机感知,通常我们在业务编码中自定义注解一般都用这个范围
更详细的可查看我另一篇文章:RetentionPolicy.CLASS和RetentionPolicy.RUNTIME的区别
(3)@Dumented:使用此注解定义的注解在其他类使用时,生成javadoc时会被一起记录。如果没有那么javadoc就看不到此注解。举个栗子:
我们定义了一个TestHello的注解,用@Documented标注
然后在UserInfo中使用TestHello:
对UserInfo生成Javadoc:
打开生成的javadoc,可以在UserInfo中看到@TestHello注解信息:
如果我们把TestHello中的@Documented去掉,再次生成javadoc,则发现@TestHello不再显示:
(4)@Inherited:表示注解可以被子类继承(注意接口上的注解不会被继承)。比如我们定义了一个TestHello注解,用@Inherited修饰它。
然后定义一个UserInfoChildren类继承UserInfo,使用TestHello注解修饰UserInfo,但不修饰UserInfoChildren。
我们写个测试方法尝试从UserInfoChildren获取TestHello,可以看到UserInfoChildren是可以获取到TestHello注解的:
(5)@Repeatable:在jdk1.8之前,同一个注解在一个地方只能用一次,在jdk1.8增加这个注解后可以支持使用多个注解,我们看一下示例怎么使用:
依然在TestHello标注Repeatable注解,但需要指定这个注解包含在哪个注解中,所以另外定义了TestHelloList注解去容纳它:
当我们重复使用多个@TestHello时,实际上就是被包装成TestHelloList。
此时我们去单独获取TestHello注解反而获取不到信息,只能获取TestHelloList。