简介
# 📚简介
Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制(JDK1.5新特性)。
一个注解就是一个类。
注解可以加在包、类、字段、方法,方法参数以及局部变量上。可以同时存在多个注解。
# 注解定义
定义注解需要的基础注解信息如下所示:
@SuppressWarnings("deprecation") //编译器警告过时(source阶段)
@Deprecated //过时(Runtime阶段)
@Override //重写(source阶段)
@Retention(RetentionPolicy.RUNTIME) //保留注解到程序运行时。(Runtime阶段)
@Target({ElementType.METHOD,ElementType.TYPE}) //标记既能定义在方法上,又能定义在类、接口、枚举上等。
public @interface MyAnnotation1 {
}
@interface表示这就是一个注解,必须@Documented表示这个注解会被javadoc工具记录@Target(ElementType.TYPE)表示这个注解可以加在类、接口或者枚举上@Retention(RetentionPolicy.RUNTIME)表示这个注解在.class文件中保留
# 注解作用
- 编译检查
例如,
@SuppressWarnings,@Deprecated和@Override都具有编译检查作用,也可以编译时动态处理,如动态生成代码。 - 反射调用 通过反射获取类、字段、方法上面的注解,可以解析并使用对应注解。
# 注解保留阶段(@Retention)
注解分为三个阶段,由@Retention定义,一个注解只能保留在一个阶段:
RetentionPolicy.SOURCE只存在java源文件,编译后消失RetentionPolicy.CLASS只存在class文件,默认RetentionPolicy.RUNTIME编译器将Annotation存储于class文件中,并且可由JVM读入
# 注解作用域(@Target)
注解作用域,由@Target定义,一个注解可以定义多个作用域:
ElementType.TYPE类、接口、枚举ElementType.METHOD方法ElementType.FIELD属性ElementType.PARAMETER参数ElementType.CONSTRUCTOR构造方法ElementType.LOCAL_VARIABLE局部变量ElementType.ANNOTATION_TYPE注解ElementType.PACKAGE包ElementType.TYPE_USE可以在任意类型使用,但是不能方法方法上ElementType.MODULE模块( Java 9+)ElementType.RECORD_COMPONENTRecord 类的组件(Java 16+)
# 注解的继承(@Inherited)
@Inherited标记表示注解可以继承,继承规则为:
- 只对类的继承有效,对接口、注解、枚举无效
- 子类会继承父类上标记的带有
@Inherited的注解 - 如果子类重写了父类的注解,则使用子类的注解
- 方法和字段注解不自动继承:即使类继承了注解,方法和字段上的注解也不会自动继承
- 多重继承场景:如果父类和祖父类都有相同注解,遵循就近原则
AnnotatedElement接口表示一个可以被添加注解的元素,如类、字段、方法、参数等,这个接口中提供了:
getAnnotations方法,可以获取父类继承的注解,遵循以上5条原则。getDeclaredAnnotations方法,可以获取当前元素定义的注解,不包含继承的注解。
# Hutool的封装
Hutool提供了AnnotationUtil和AnnotatedElementUtil工具类,用于获取注解对象、注解值等,同时对于注解继承、复合注解的处理也做了封装。