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

 

 

 

 

 

 

 

 

 

  

  

 

posted @ 2020-10-25 12:45  think的海角  阅读(98)  评论(0编辑  收藏  举报