java-注解

Java 注解

一、注解的定义与本质

  • 注解是添加在 Java 源码(类、方法、字段、参数等)前的特殊 “元数据” 标注,格式为 @注解名(参数)
  • 与普通注释(被编译器忽略)不同,注解会被编译进入 .class 文件,用于被工具(编译器、框架、JVM 等)读取和处理。

二、注解的三类作用(按生命周期划分)

  1. 编译器使用的注解(编译期有效)

    • 作用:仅在编译阶段被编译器处理,编译后被丢弃,不进入 .class 文件。

    • 示例:

      • @Override:强制检查方法是否正确覆写父类方法。
      • @SuppressWarnings:忽略指定代码的编译警告(如未使用变量)。
  2. 工具处理 .class 使用的注解(类加载期有效)

    • 作用:编译后存在于 .class 文件中,但类加载后不驻留内存,由底层工具(如字节码增强库)动态处理。
    • 特点:普通开发者无需手动处理,框架底层使用(如字节码生成工具)。
  3. 运行期可读取的注解(运行期有效)

    • 作用:编译后存在于 .class 文件,且在 JVM 运行期可通过反射读取,是最常用的注解类型。

    • 示例:

      • @PostConstruct:标记方法在对象构造后自动调用(框架通过反射实现)。
      • @Resource@Autowired:依赖注入注解(Spring 框架使用)。

三、注解的配置参数

  • 支持的参数类型

    • 基本类型(intboolean 等)、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;
}