Java Spring @Retention三种保留策略
SOURCE 级别
典型例子: @Override
, @SuppressWarnings
编译前: 在源代码中存在,IDE 可以识别并提供功能支持。
编译时: 编译器使用这些注解进行检查(如确保方法确实是重写父类方法)。
编译后: 注解信息被丢弃,不会存在于 .class 文件中。
运行时: 完全不存在,无法通过反射获取。
例如 @Override
仅用于编译器检查方法是否正确重写,完成检查后就没有用了。
CLASS 级别
典型例子: Lombok 的 @Getter
, @Setter
编译前: 在源代码中存在。
编译时: 注解处理器读取这些注解,生成额外代码。
编译后: 注解信息保留在 .class 文件中。
运行时: 存在于类文件中,但不能通过反射 API 获取,一般用于字节码工具或类加载时分析。
例如 Lombok 的注解在编译时自动生成 getter/setter 方法,编译后这些方法已经生成,注解的使命已完成。
RUNTIME 级别
典型例子: Spring 的 @Autowired
编译前: 在源代码中存在。
编译时: 注解信息被保留。
编译后: 注解信息完整保留在 .class 文件中。
运行时: 可以通过反射 API 完整获取注解信息并据此执行逻辑。
例如 Spring 的 @Autowired
在应用启动时被容器通过反射读取,然后据此进行依赖注入