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;
}