说一下你对注解的理解?

Java 注解本质上是一种标记,类似于生活中人们的一些小装饰品,例如帽子或眼镜。

注解可以标记在类、方法、属性等上面,并且可以设置一些值,比如帽子的颜色可以是绿色。

通过在编译或运行阶段识别这些标记,我们可以执行相应的操作,这就是注解的作用。

例如,我们常见的 AOP(面向切面编程)使用注解作为切点,这是注解在运行时的应用;而像 Lombok 这样的工具则是在编译时使用注解。

注解的生命周期分为三个主要类别:

  • RetentionPolicy.SOURCE:仅供编译器使用,不会被写入 class 文件中。
  • RetentionPolicy.CLASS:会被写入 class 文件,但在类加载时被丢弃,也就是运行时不再存在这些注解信息。
  • RetentionPolicy.RUNTIME:会被写入 class 文件,并且永久保存,可以通过反射来获取注解信息。

因此,前文中提到的解析操作没有具体指明是解析什么,这是因为不同生命周期的注解解析操作是不同的。

像常见的:

1.png

某些注解是供编译器使用的,编译器在编译过程中会进行检查,一旦通过检查,编译过程就完成了,因此在生成的 class 文件中不会包含这些注解信息,比如 Override 标记。

另外,像 Spring 中常见的 Autowired 注解属于 RUNTIME 生命周期,这意味着我们可以在运行时通过反射获取注解的信息,并且可以访问注解中标记的值,比如 required 属性。这为我们在运行时动态地处理注解提供了便利。

2.png

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题