MST

星途 面试题库

面试题:Java元注解RetentionPolicy的不同取值如何影响注解的生命周期

详细阐述Java元注解RetentionPolicy的SOURCE、CLASS、RUNTIME三个取值,它们在注解生命周期上有何不同?在实际开发中,针对不同场景应如何选择合适的取值?
39.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. RetentionPolicy.SOURCE

  • 注解生命周期:该取值表示注解仅保留在源文件(.java)中,在编译成字节码文件(.class)时,注解信息会被丢弃。也就是说,编译器在编译过程中不会将此类注解的信息存储到字节码文件中,运行时更无法获取到这类注解。
  • 适用场景:适用于一些仅在编译期起作用的注解,例如一些用于代码检查、生成辅助代码等场景。比如,@Override注解,它主要是让编译器检查方法是否真的重写了父类方法,编译完成后就不再需要该注解信息,所以使用SOURCE策略。

2. RetentionPolicy.CLASS

  • 注解生命周期:此取值意味着注解会保留在字节码文件中,但在运行时JVM不会加载该注解信息。即从源文件编译成字节码文件时,注解信息会被保留在字节码中,但在运行时,程序无法通过反射等机制获取到该注解。
  • 适用场景:常用于一些需要在字节码层面进行处理,但运行时不需要获取注解信息的场景。例如,一些字节码增强框架,它们在编译后对字节码进行处理,利用这类注解来标识需要增强的类或方法,处理完后运行时并不需要再访问这些注解,像AspectJ框架在某些场景下可能会用到这种注解保留策略。

3. RetentionPolicy.RUNTIME

  • 注解生命周期:该取值表明注解不仅会保留在源文件和字节码文件中,在运行时JVM也会加载该注解信息,程序可以通过反射机制在运行时获取到注解的详细信息。
  • 适用场景:适用于运行时需要根据注解信息进行动态处理的场景。例如,Spring框架中使用的@Component@Autowired等注解,Spring容器在运行时通过反射获取这些注解信息,从而完成Bean的注册、依赖注入等操作。又如,自定义的权限控制注解,在方法调用时,通过反射获取方法上的权限注解信息,进行权限校验。