java annotation
0 背景
不同公司一般会使用不同的框架,而其框架中必然会使用到注解和反射。而注解的基础为元注解(修饰注解的注解),此处记录下对元注解的理解(针对jdk1.8)。
1 元注解包含6个,如java.lang.annotation包下的 Documented、Inherited、Target、Retention、Repeatable及Native,其中 前四个为jdk1.5引入,后两个为jdk1.8引入,Native目前没有使用过,Target和Retention使用较简单,Documented、Inherited及Repeatable的使用存在疑惑,故此处记录一下最新理解,以备后用。
2 通过官网解释、查询资料及实验,总结如下。
2.1 Documented
被其修饰的非元注解(自定义注解和预定义注解),修饰程序中的元素时,如类、属性等。使用javadoc生成的API包含注解,展示的形式如源码。
具体如下图所示(以修饰类的注解举例,修饰其他元素的注解类似):
自定义注解Table
自定义注解Table的使用
javadoc生成API过程及结果
2.2 Inherited
Table注解被Inherited修饰,故被Table修饰的类可以被其子类继承。(元注解是不能被继承的,可以理解元注解只是解释说明一下自定义注解,元注解和自定义注解修饰的类没有关系。)
官方文档,说Inherited修饰的自定义注解,只有修饰类的时候,启子类才能继承。此处用Inherited修饰注解Field,用Field来修饰User类的属性,看子类SubUser是否能继承。结论,不能继承,和官网结论一致。
2.3 Repeatable
引入该注解之前,下图中的写法是错误的,ide编译通不过,即一个元素只能被同一个注解修饰一次。
引入Repeatable之后,一个元素可以被同一个注解修饰多次。本质就是,把需要多次使用的注解,封装为一个新注解的属性,且该属性为该类型的数组。
如下图:Service注解需要在同一元素重复使用,故将其封装为RepeatAnnotation注解的属性,且为Service[] 数组类型,且在Service中引入@Repeatable(RepeatAnnotation.class)
代码中Repeatable修饰的注解Service的使用
后续有新的理解,再更新记录。
备注:本记录只做学习交流使用,不进行盈利性操作。
参考:
https://docs.oracle.com/javase/8/docs/api/index.html
https://www.jianshu.com/p/df22b05d5573
https://blog.csdn.net/u010979642/article/details/102855171
https://www.bilibili.com/video/BV19W411R772?from=search&seid=152468195776095893