1.认识注解
Java 注解就是 Annotation ,是 Java 代码里的特殊标记
- 为 Java 程序提供了一种形式化的方法
- 用来表达额外的某些信息
- 这些信息是代码本身无法表示的
- 可以方便得而使用注解修饰程序元素
- 包括类、方法、成员变量等
- 以标签的形式存在于 Java 代码中
- 不影响程序代码的编译和执行
- 语法
- 只需在程序元素前面加上 @ 符号即可
@Override
@SuppressWarnings(value="unused")
@MyTag(name="Amber",age=28)
- 注解的使用规范
- 将注解置于所有修饰符之前
- 通常将注解单独放置在一行
- 默认注解可用于修饰任何程序元素
- 包括类、方法、成员变量……
2.注解分类
在 Java 中,根据注解的使用方法和用途,可分为3类,分别为内建注解、元注解和自定义注解
(1)内建注解
- @Override 注解
- 被用来标注方法,用来表示该方法时重写父类的某方法
- @Deprecated 注解
- 标识程序元素已过时
- 编译器将不再鼓励使用这个被标注的程序元素
- 如果使用编译器会在该程序元素上画一条斜线,表示该程序元素已过时
- @SuppressWarnings 注解
- 标识阻止编译器警告
- 被用于有选择地关闭编译器对类、方法和成员变量等程序元素及其子元素地警告
- 会一直作用于该程序元素地所有子元素
- 常用参数:
- deprecation : 使用了过时的程序元素
- unchecked : 执行了未检查的转换
- unused : 有程序元素未被使用
- fallthrough : switch 程序块直接通往下一种情况而没有 break
- path : 在类路径、源文件路径等中有不存在的路径
- serial : 在可序列化的类上缺少 serialVersionUID 定义
- finally : 任何 finally 子句不能正常完成
- all : 所有情况
- 当注解类型只有一个 value 成员变量,使用该注解时可以直接在注解后的括号中指定 value 成员变量的值
- 无需使用 name = value 机构对的形式
(2)元注解
- @Target注解
- 用于指定被其修饰的注解能用于修饰哪些程序元素
- 有唯一的 value 作为成员变量,是 java.lang.annotation.ElementType 类型
- ElementType.ANNOTATION_TYPE : 注释声明
- ElementType.CONSTRUCTOR :构造方法声明
- ElementType.FIELD :成员变量声明
- ElementType.LOCAL_VARIABLE : 局部变量声明
- ElementType.METHOD : 方法声明
- ElementType.PACKAGE :包声明
- ElementType.PARAMETER :参数声明
- ElementType.TYPE :类、接口或枚举声明
- @Retention注解
- 描述了被其修饰的注解是否被编译器丢弃或者保留在 class 文件中
- 默认情况下,注解被保存在 class 文件中,但在运行时并不能被反射访问
- 包含一个 RetentionPolicy 类型的 value 成员变量,其取值来自于 java.lang.annotationg.RetentionPolicy 的枚举类型
- RetentionPolicy.CLASS :默认值,表示编译器会把被修饰的注解记录在 class 文件中,但在运行程序时,虚拟机不再保留注解,从而无法通过反射对注解进行访问
- RetentionPolicy.RUNTIME :表示编译器将注解记录在 class 文件中,当运行程序时,虚拟机会保留注解,可以通过反射获得该注解
- RetentionPolicy.SOURCE :表示编译器会直接丢弃被修饰的注解
- 描述了被其修饰的注解是否被编译器丢弃或者保留在 class 文件中
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Retention{
RetentionPolicy value();
}
- @Documented注解
- 用于指定被其修饰的注解将被 JavaDoc 工具提取成文档
- 没有成员变量
- @ Inherited注解
- 用于指定被其修饰的注解将具有继承性
(3)自定义注解
- 注解类型是一种接口,但它又不同于接口
- 定义一个性地注解类型与定义一个接口非常相似,要使用 @interface 关键字
- public @interface AnnotationTest{}
- 定义一个性地注解类型与定义一个接口非常相似,要使用 @interface 关键字
- 注解类型定义之后就可以用它来修饰程序中的类、接口、方法和成员变量等程序元素
- 自定义注解在实际的开发中使用频率并不是很多
3.读取注解信息
- java.lang.reflect 包下的 AnnotationElement 接口代表程序中可以接收注解的程序元素
- Class : 类定义
- Constructor : 构造方法定义
- Field : 类的成员变量定义
- Method : 类的方法定义
- Package : 类的包定义
- java.lang.reflect.AnnotationElement 接口是所有程序元素的父接口
- 程序通过反射获得某个类的 AnnotationElement 对象,调用该对象的3个方法就可以来访问注解信息
- getAnnotation() :用于返回该程序元素上存在的、指定类型的注解
- getAnnotations() :用于返回该程序元素上所有的注解
- getAnnotationPresent() :用于判断该程序元素上是否包含指定类型的注解
- 程序通过反射获得某个类的 AnnotationElement 对象,调用该对象的3个方法就可以来访问注解信息
- 需要获取某个注解里的元数据,可以将注解强制类型转换成所需的注解类型,通过注解对象的抽象方法来访问元数据