使用注解
约 668 字大约 2 分钟
2025-07-17
1.1 什么是注解?
注解是一种特殊的“注释”,它位于 Java 源代码的类、方法、字段或参数之前。与普通注释不同,注解可以被编译器打包到 .class
文件中,成为一种用于标注的“元数据”。
// this is a component:
@Resource("hello")
public class Hello {
@Inject
int n;
@PostConstruct
public void hello(@Param String name) {
System.out.println(name);
}
@Override
public String toString() {
return "Hello";
}
}
1.2 注解的作用
注解本身对代码逻辑没有任何影响,其作用完全取决于工具。Java 的注解可以分为三类:
编译器使用的注解:例如
@Override
和@SuppressWarnings
。这类注解在编译后会被编译器丢弃,不会进入.class
文件。工具处理
.class
文件使用的注解:这类注解会被编译到.class
文件中,用于在加载 class 时进行动态修改等特殊操作。加载结束后不会存在于内存中,通常由底层库使用。程序运行期能够读取的注解:这类注解在加载后一直存在于 JVM 中,可以在程序运行期间被读取和使用。例如,
@PostConstruct
注解的方法会在构造方法后自动被调用。
1.3 注解的配置参数
定义注解时,可以定义配置参数。配置参数的类型可以是:
- 所有基本类型
- String
- 枚举类型
- 基本类型、String、Class 以及枚举的数组
由于配置参数必须是常量,因此注解在定义时就已经确定了每个参数的值。配置参数可以有默认值,如果缺少某个配置参数,则使用默认值。
大部分注解会有一个名为 value
的配置参数。当只对 value
参数赋值时,可以省略参数名,直接写常量值。如果只写注解,相当于全部使用默认值。
例如:
public class Hello {
@Check(min=0, max=100, value=55)
public int n;
@Check(value=99)
public int p;
@Check(99) // @Check(value=99)
public int x;
@Check
public int y;
}
@Check(min=0, max=100, value=55)
明确定义了三个参数。@Check(value=99)
和 @Check(99)
效果相同,都只定义了 value
参数。@Check
表示所有参数都使用默认值。
注解本身不会直接影响程序的运行,但是可以通过反射或其他方式在运行时读取这些注解,并根据注解中提供的信息来执行额外的验证、处理或其他操作。例如,可以编写一个程序,读取带有 @Check
注解的字段,并验证它们的值是否符合注解中定义的约束条件。