说一下你对注解的理解?

说一下你对注解的理解?
Java 注解本质上是一种标记,类似于生活中人们的一些小装饰品,例如帽子或眼镜。
注解可以标记在类、方法、属性等上面,并且可以设置一些值,比如帽子的颜色可以是绿色。
通过在编译或运行阶段识别这些标记,我们可以执行相应的操作,这就是注解的作用。
例如,我们常见的 AOP(面向切面编程)使用注解作为切点,这是注解在运行时的应用;而像 Lombok 这样的工具则是在编译时使用注解。
注解的生命周期分为三个主要类别:
- RetentionPolicy.SOURCE:仅供编译器使用,不会被写入 class 文件中。
- RetentionPolicy.CLASS:会被写入 class 文件,但在类加载时被丢弃,也就是运行时不再存在这些注解信息。
- RetentionPolicy.RUNTIME:会被写入 class 文件,并且永久保存,可以通过反射来获取注解信息。
因此,前文中提到的解析操作没有具体指明是解析什么,这是因为不同生命周期的注解解析操作是不同的。
像常见的:
某些注解是供编译器使用的,编译器在编译过程中会进行检查,一旦通过检查,编译过程就完成了,因此在生成的 class 文件中不会包含这些注解信息,比如 Override 标记。
另外,像 Spring 中常见的 Autowired 注解属于 RUNTIME 生命周期,这意味着我们可以在运行时通过反射获取注解的信息,并且可以访问注解中标记的值,比如 required 属性。这为我们在运行时动态地处理注解提供了便利。