java注解只是一种不会被编译器忽略的注释。本身对代码逻辑没有任何影响(可以用来判断是否存在,能读取内容信息),其使用效果完全由使用工具决定。
@Target表示注解作用范围,常用值包括以下五个,具体查看ElementType
- TYPE:类、接口(包括注解)、枚举
- FIELD:字段声明(包括枚举常量)
- METHOD:方法声明
- CONSTRUCTOR:构造器声明
- PARAMETER:形式参数声明
@Retention表示注解生命周期,值为RetentionPolicy枚举
- SOURCE:注解仅在源码存活,编译时消失。如@Override和@SuppressWarning,lombok的@Data,@Builder。
- CLASS:注解在字节码期存活,jvm加载class文件时消失(不标注@Retention时为默认值)
- RUNTIME:注解在运行期仍存活。大多数注解需要指定此生命周期(如spring的@SpringBootApplication,@Component等)
@Documented是javadoc等工具生成文档后,文档中注解所在位置是否显示注解的开关。如下
对比
@Inherited表示继承。如果注解声明上存在该元注解,并且用户试图在类上(仅限于类,不包括接口等)获取该注解,而类声明没有此类型的注解,将自动查询类的超类并重复此过程直到找到或达到类层次结构顶部。
@Repeatable(since(自从) jdk1.8)表示其修饰的注解是可重复的。@Repeatable的值是另一个注解,可以通过这个另一个注解的值来包含这个可重复的注解。如下
后续可以获取标注了多个@Value的Method对象,Method对象包含的注解信息中不是两个@Value而是一个@Values,如下
应用场景
@Native(无需背诵,了解即可)
@Native 注解修饰定义常量值的字段,表示它可以被本地代码引用。@Native 常被代码生成工具使用。
参考:java源码