Java 注解

注解,代码中的特殊标记,可以在编译、类加载、运行时被读取,并执行相应的处理。

一、什么是注解?

Java 中的注解是代码中的特殊标记,它不影响程序的执行,无论增加、删除注解,代码的执行都不会受到影响。

通过注解,程序开发人员可以在不改变原有逻辑的情况下,在源代码中嵌入补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或部署。

二、基本注解

Java 提供了 4 个基本注解。

1. @Override

用于表示方法进行了重写。

如果被注解的方法并非重写父类方法,则编译器会发出错误警告。

2. @Deprecated

用于表示某个类、方法已过时。

当其它程序使用被注解的类、方法时,编译器将会给出警告,提示该类、方法已过时。

3. @SuppressWarning

用于取消编译器的警告。

该注解将会一直作用到被注解元素的所有子元素。因此,如果希望关闭整个类的编译器警告,可以对类进行注解。

4. @FunctionalInterface

用于声明函数式接口。

编译器将检查被注解的接口,确保该接口内有且仅有一个抽象方法。

三、元注解

JDK 还提供了 6 个元注解,其中 5 个元注解用于修饰注解,@Repeatabl 用于定义重复注解。

1. @Retention

用于指定注解的保留时长。

1
@Retention(value)

其中,value 值可以为:

  • RetentionPolicy.CLASS:默认;注解会保留至 class 文件中,但不可以被 JVM 读取

  • RetentionPolicy.RUNTIME:注解保留至 class 文件中,可以被 JVM 读取

  • RetentionPolicy.SOURCE:注解仅保留至源代码中,编译至 class 文件时直接丢弃

2. @Target

用于指定注解能够修饰那些程序单元。

1
@Target(value)

其中,value 值可以为:

  • ElementType.ANNOTATION_TYPE:注解可以修饰注解
  • ElementType.CONSTRUCTOR:注解可以修饰构造器
  • ElementType.FIELD:注解可以修饰成员变量
  • ElementType.LOCAL_VARIABLE:注解可以修饰局部变量
  • ElementType.METHOD:注解可以修饰方法
  • ElementType.PACKAGE:注解可以修饰包
  • ElementType.PARAMETER:注解可以修饰参数
  • ElementType.TYPE:注解可以修饰类、接口、枚举

3. @Documented

用于指定注解能够被 Javadoc 工具提取成文档。

即被 @Documented 修饰的注解将在 Javadoc 工具生成的文档中保留

4. @Inherited

用于指定注解具有继承性。

某个类被注解,其子类也自动被注解

5. @Repeatable

用于指定注解可以重复注解同一个程序单元。

6. @Native

用 @Native 注解修饰成员变量,表示这个变量可以被本地代码引用,常常被代码生成工具使用。

了解即可。

四、自定义注解

1. 定义注解

1
2
3
4
元注解
public @intergace 注解名称 {

}

2. 成员变量

(1) 定义

在定义注解时,可以定义成员变量,成员变量在注解定义中以”无形参的方法”形式声明。

1
2
3
4
5
6
7
8
元注解
public @intergace 注解名称 {
// 定义成员变量
数据类型 成员变量名();

// 定义有默认值的成员变量
数据类型 成员变量名() defalut 默认值;
}

(2) 使用

一旦在注解中定义了成员变量,且该成员变量没有默认值,使用该注解时就应该为成员变量指定值。

1
@注解名称(成员变量名 = 值)

(3) 示例

1
2
3
4
public @intergace Student {
String name();
int age();
}
1
@Student(name = "小张", age = 12)

五、注解信息的获取

通过反射,可以获取注解信息。

六、类型注解

Java8 新特性,允许注解应用在任何地方。

略。

七、通过注解实现工厂模式

Java注解处理器

参考