在Spring中,我们经常能够看到各种各样的注解,Java自身也定义了很多的注解,这些注解的添加能够让程序员明确的知道这个类的状态。
Java中比较常见的注解类:
- @Override 重写父类的方法
- @Deprecated 标记过时,不建议再使用
- @SuppressWarnings 消除警告
Java中的注解类,都使用@interface标记
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
在Override注解类中,可以看到有两个注解@Target和@Retention对Override进行了修饰,这些用来修饰注解类的注解称为元注解,元注解是注解的注解。
Java中的元注解主要有以下几种
- Target
- Retention
- Documented
- Inherited
Target
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Target {
ElementType[] value();
}
可以看到,Target有一个属性value,类型是ElementType数组,ElementType是一个枚举类型,主要用来标记被@Target修饰的注解类可应用在什么位置上
枚举值为
- ANNOTATION_TYPE 可应用在注解类上
- CONSTRUCTOR 构造器
- FIELD 成员变量
- LOCAL_VARIABLE 局部变量
- METHOD 方法
- PACKAGE 包
- PARAMETER 参数
- TYPE 类、接口以及枚举
1.8之后新增了两个枚举属性
- TYPE_PARAMETER 类型参数声明
- TYPE_USE 使用的类型
Retention
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention {
RetentionPolicy value();
}
Retention注解有一个属性value,是RetentionPolicy类型的,RetentionPolicy是一个枚举类型,这个枚举决定了Retention注解的保留机制
RetentionPolicy有3个值:
- CLASS 表示当程序编译时注解的信息被保留在class文件(字节码文件)中,但在运行的时候不会被虚拟机读取
- RUNTIME 表示当程序编译时注解的信息被保留在class文件(字节码文件)中,运行时也会被虚拟机读取
- SOURCE 表示注解的信息会被编译器抛弃,不会留在class文件中,注解的信息只会留在源文件中
Documented
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Documented {
}
@Documented元注解用于声明被该注解修饰的注解类是可以写入javadoc中的
Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Inherited {
}
@Inherited用于声明被该注解修饰的父类的注解,能够被子类继承
@Inherited使用的较少,稍微理解即可