在Java中,Annotation(注解)是一种用于描述代码的元数据。它们可以为我们的代码提供额外的信息,这些信息可以在编译时或运行时被读取。而注解的生效时机,主要由Java的@Retention
注解来控制。
一、注解的生效时机
Java中的java.lang.annotation.RetentionPolicy
枚举定义了注解的生命周期,主要有以下三种:
1、RetentionPolicy.SOURCE
此类注解只在源代码级别保留,编译完成后就不再使用。这类的注解仅对源码阅读时有帮助,比如@Override
,@SuppressWarnings
等。
2、RetentionPolicy.CLASS
此类注解只在编译阶段和类加载的过程中起作用,在运行时不起作用。这种类型的注解在字节码文件的处理中起到作用,如动态代理等操作。
3、RetentionPolicy.RUNTIME
此类注解在运行时仍然活跃。这种类型的注解会被加载进 JVM 中,并在运行时可以通过反射获取到。这类注解是我们最熟悉的,如@SpringBoot中的@RequestMapping
,@Autowired
等。
@Retention(RetentionPolicy.RUNTIME) public @interface MyCustomAnnotation { // ... }
二、注解何时生效
具体的注解何时生效则取决于我们在代码中如何使用这些注解以及何时对其进行读取:
- 当注解被定义为
RetentionPolicy.SOURCE
时,它们在源代码分析和编译阶段生效。可以被代码编辑器或编译器用来执行额外的源代码检查。 - 当注解被定义为
RetentionPolicy.CLASS
时,它们在编译时生效。虚拟机在类加载阶段才会使用这些注解,如一些代码处理工具(如Lombok),AOP等。 - 对于
RetentionPolicy.RUNTIME
注解,在程序运行时,我们通过Java反射机制读取注解信息,即认为注解在运行时生效。例如在运行时进行数据验证,单元测试,DI框架等,都可能需要在运行时读取注解。
小结
在Java编程中,理解注解,并知道如何正确使用注解对编写高质量的代码至关重要。@Retention注解则是控制我们自定义注解的生命周期,理解它的三种策略,帮助我们根据实际需求选择最适合的注解策略。
在具体的编程实践中,我们大部分时候都会使用运行时注解,这也是Spring等框架的基础。当然,也有一些特定的情况,我们需要使用源码注解或类注解,比如Lombok,这都取决于我们的具体需求。
希望本文能对你有所帮助,谢谢阅读。