注解详解
一、什么是注解
先看看注解长啥样
注解就是一种特殊标记,这种标记可以告诉处理程序看到它时应该相应地做哪些操作。没有对应处理程序的注解是没有意义的。打个比方,我们在学习过程中,会在书上做各种标记,有的地方用红色笔画横线,有的地方用蓝色笔画波浪线。别人看了这些标记,最多觉得你把书标得五颜六色,实质上对别人提高学习成绩没啥用。但是如果你告诉他红色是期末考试重点,蓝色是月考重点,却可以提高他考试拿高分的效率。
- 【红色横线/l蓝色波浪线】——【注解】
- 【期末考试前重点复习红色内容/月考前重点复习蓝色内容】——【处理程序逻辑】
二、为什么要使用注解
注解的优势
- 可以在不影响业务逻辑的基础上,附加一些功能,即非入侵式增强,如单元测试、监控、日志记录等
- 简化编程,实现高内聚低耦合
- 方便开发调试,进行一些提示警告,如重写时名称书写错误、声明的变量没有使用等
- 很多成熟框架中如spring、springboot等,替代配置文件,进行自动装配
框架=注释+反射+设计模式 - 为对应项目自动生成文档
三、如何定义注解
注解是与类、接口同一级别的类型,使用关键字@interface
进行定义。注解中的成员仅包含成员变量,不包含成员方法,并且该成员变量比较特殊,通过没有方法体的无参方法形式
来表示。
public @interface{
String value() default "hello annotation";
int[] nums();
}
- 成员变量可以是任何类型
- 成员变量个数可以是任意多个,可以没有成员变量
- 当只有一个成员变量时,其名称最好写为value
- 可以通过
default
关键字来设置默认值
四、注解有哪些类型
注解一共有三种类型
- 【jdk内置注解】如@Override、@SupressWarnings、@Deprecated
- 【元注解】:注解注解的注解,就是该注解是在定义注解时使用
- @Retention:定义注解的生命周期
- @Target:定义注解的作用对象
- @Inherited:定义注解是否具有继承性
- @Documented:定义注解是否会被
javadoc
转成文档
- 【 自定义注解】:见上述注解定义部分
下面主要着重介绍元注解
1、@Retention
定义:定义注解生命周期的注解
注解的生命周期——通过一个枚举类表示RetentionPolicy
- RetentionPolicy.SOURCE
- RetentionPolicy.CLASS,默认
- RetentionPolicy.RUNTIME
2、@Target
定义:定义注解的作用对象
注解的作用对象——通过一个枚举类表示ElementType
- ElementType.TYPE
- ElementType.FIELD
- ElementType.METHOD
- ElementType.PARAMETER
- ElementType.CONSTRUCTOR
- ElementType.LOCAL_VARIABL
- ElementType.ANNOTATION_TYPE,元注解
- ElementType.PACKAGE
3、@Inherited
定义:如果一个注解上标注了@Inherited,表示该注解具有继承性,即如果一个类上使用了该注解,则子类上即使没有显示标注该注解,实际上等价于拥有该注解
- 默认情况下,注解没有继承性
4、@Documented
**定义:**定义注解会被javadoc
转成文档存储
五、如何使用注解
- 定义一个注解
- 编写处理程序(借助反射)
六、注解的新特性
注解的功能是在JDK1.5中引入,在JDK8中增加了两个新特性
1、增加了一个元注解——@Repeatable
定义:表示注解可重复设置
同一个目标对象上设置多个重复的注释
JDK8以前的解决方案
- 定义一个对应注释数组类型为成员变量的注释
- 将多个注释为参数传入
JDK8以后的解决方案
- 定义一个对应注释(目标注解)数组类型为成员变量的注释(组注解)
- 目标注解和表示组的注解中, @Inherited、@Retention、@Target等元注解必须保持一样的设置
2、扩展了注解的作用对象——TPYE_PARAMETER/TYPE_USE
定义