Java 注解
一、注解的定义与本质
- 注解是添加在 Java 源码(类、方法、字段、参数等)前的特殊 “元数据” 标注,格式为
@注解名(参数)
。 - 与普通注释(被编译器忽略)不同,注解会被编译进入
.class
文件,用于被工具(编译器、框架、JVM 等)读取和处理。
二、注解的三类作用(按生命周期划分)
-
编译器使用的注解(编译期有效)
-
作用:仅在编译阶段被编译器处理,编译后被丢弃,不进入
.class
文件。 -
示例:
@Override
:强制检查方法是否正确覆写父类方法。@SuppressWarnings
:忽略指定代码的编译警告(如未使用变量)。
-
-
工具处理
.class
使用的注解(类加载期有效)- 作用:编译后存在于
.class
文件中,但类加载后不驻留内存,由底层工具(如字节码增强库)动态处理。 - 特点:普通开发者无需手动处理,框架底层使用(如字节码生成工具)。
- 作用:编译后存在于
-
运行期可读取的注解(运行期有效)
-
作用:编译后存在于
.class
文件,且在 JVM 运行期可通过反射读取,是最常用的注解类型。 -
示例:
@PostConstruct
:标记方法在对象构造后自动调用(框架通过反射实现)。@Resource
、@Autowired
:依赖注入注解(Spring 框架使用)。
-
三、注解的配置参数
-
支持的参数类型:
- 基本类型(
int
、boolean
等)、String
、枚举类型、上述类型的数组(包括Class
类型数组)。 - 限制:参数必须为常量,确保注解定义时值已确定。
- 基本类型(
-
默认值与简化写法:
- 参数可设置默认值,未显式赋值时使用默认值(如
@Check
表示所有参数用默认值)。 - 若注解仅有一个名为
value
的参数,赋值时可省略参数名,直接写值(如@Check(99)
等价于@Check(value=99)
)。
- 参数可设置默认值,未显式赋值时使用默认值(如
四、核心示例
// 定义注解 @Check,包含三个参数(value 有默认值 0)
@interface Check {
int min() default 0;
int max() default 100;
int value() default 0;
}
// 使用注解
public class Hello {
@Check(min=0, max=100, value=55) // 显式赋值所有参数
public int n;
@Check(99) // 仅赋值 value(省略参数名)
public int x;
@Check // 全部使用默认值
public int y;
}