元注解@Target,@Retention,@Documented,@Inherited,@Repeatable

所谓元注解就是作用于其他注解的注解。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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值