12、注解
12.1、介绍
Java5后加入了注解(Annotation)的概念,它是一种元数据,含有一些描述信息,可以把注解看成一个标签,它含有一些描述信息,用来指定一些规则约束和标准定义。说白了就是对一些类一些方法做一个说明,比如说在Spring框架中,类上加上@Controller注解就表示这个类是控制层的控制器,加上@Configuration就表示这个类是一个配置类。
把他当成一个标签更好理解一些,比方说我们在公司中有很多部门,你是后勤部门的就主要做后勤相关工作,你是开发部门的就去做项目开发,注解就是起到类似的功能。
注解可以像修饰符一样被使用, 可用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明, 这些信息被保存在 Annotation 的 “name=value” 中。
其实注解也属于一种数据类型,用@interface 来定义。比如标注方法为
![image-20220902172251530](https://yudejava.oss-cn-hangzhou.aliyuncs.com/typora/202301202312541.png)
注解在使用时就是通过@开头,如@Override(重写方法)等等,还有在文档注释中有很多注解来标注基本信息:
- @author 标明开发该类模块的作者,多个作者之间使用,分割
- @version 标明该类模块的版本
- @see 参考转向,也就是相关主题
- @since 从哪个版本开始增加的
- @param 对方法中某参数的说明,如果没有参数就不能写(@param 形参名 形参类型 形参说明)
- @return 对方法返回值的说明,如果方法的返回值类型是void就不能写(@return 返回值类型 返回值说明)
- @exception 对方法可能抛出的异常进行说明 ,如果方法没有用throws显式抛出的异常就不能写其中(@exception 异常类型 异常说明)
在JavaSE中注解的使用比较简单,使用的也不多,但是未来的开发模式都是基于注解,尤其是开发过程中常用的各种框架基本都是基于注解来使用的。
12.2、基本注解
在Java SE 提供了 5 个基本注解:
-
@Override:指定方法重写的,只能修饰方法并且只能用于方法重写
-
@Deprecated:可以用来注解类、接口、成员方法和成员变量等,用于表示某个元素(类、方法等)已过时,有两个属性
- forRemoval:boolean类型,指定该 API 在将来是否会被删除。
- since:String类型,指定该 API 从哪个版本被标记为过时。
-
@SuppressWarnings :可以取消一些编译器产生的警告,用在类上对所有方法起作用,用在方法上对单个方法起作用
关键字 用途 all 抑制所有警告 boxing 抑制装箱、拆箱操作时候的警告 cast 抑制映射相关的警告 dep-ann 抑制启用注释的警告 deprecation 抑制过期方法警告 fallthrough 抑制在 switch 中缺失 breaks 的警告 finally 抑制 finally 模块没有返回的警告 hiding 抑制相对于隐藏变量的局部变量的警告 incomplete-switch 忽略不完整的 switch 语句 nls 忽略非 nls 格式的字符 null 忽略对 null 的操作 rawtypes 使用 generics 时忽略没有指定相应的类型 restriction 抑制禁止使用劝阻或禁止引用的警告 serial 忽略在 serializable 类中没有声明 serialVersionUID 变量 static-access 抑制不正确的静态访问方式警告 synthetic-access 抑制子类没有按最优方法访问内部类的警告 unchecked 抑制没有进行类型检查操作的警告 unqualified-field-access 抑制没有权限访问的域的警告 unused 抑制没被使用过的代码的警告 -
@SafeVarargs:当static修饰的方法,使用泛型且可变参数未指明具体类型时,可用此注解消除编译器警告
-
@FunctionalInterface:指定某个接口必须是函数式接口,用于Lambda 表达式的接口
12.3、元注解
java中有6 个元注解,它们来自于 java.lang.annotation 包,元注解用在注解里的,它用来对注解进行一些修饰和配置,自定义注解时可以使用元注解进行设置。
- @Documented:标记注解,用 @Documented 注解修饰的注解类会被 JavaDoc 工具提取成文档。
- @Target({ElementType …….}):用来指定一个注解的使用范围
- ElementType.CONSTRUCTOR:用于构造方法
- ElementType.FIELD:用于成员变量
- ElementType.LOCAL_VARIABLE:局部变量
- ElementType.METHOD:方法
- ElementType.PACKAGE:用于包
- ElementType.TYPE:用于类、接口(包括注解类型)或 enum 声明
- ElementType.PARAMETER:类型参数
- @Retention:用于描述注解的生命周期
- RetentionPolicy.SOURCE:注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS :注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- RetentionPolicy.RUNTIME:注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,在程序运行时可以获取到它们。
- @Inherited:标记注解,一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解。
- @Repeatable:JDK8增加,被其修饰过的注解,其注解的值可以同时取多个,注解可以同时写多个
- @Native:JDK8增加,修饰成员变量,则表示这个变量可以被本地代码引用
12.4、自定义注解
我们也可以自定义注解,使用:权限修饰符 @interface 名字
来定义,它自动继承了java.lang.annotation.Annotation接口。
// 定义一个简单的注解类型,可以用在方法和类上
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface MyAnnotation{
}
定义注解和定义类相似,注解前面的访问修饰符有两种,分别是公有访问权限(public)和默认访问权限(默认不写)。一个源程序文件中可以声明多个注解,但只能有一个是公有访问权限的注解。且源程序文件命名和公有访问权限的注解名一致。
注解中可以定义成员变量,成员变量以无参数方法的方法形式来声明,其方法名和返回值定义了该成员变量的名字和类型(配置参数)。其中不包含任何成员变量的注解称为标记注解。类型只能是八种基本数据类型、String类型、Class类型、enum类型、Annotation类型、以上所有类型的数组。