面试题答案
一键面试1. RetentionPolicy.SOURCE
- 注解生命周期:该取值表示注解仅保留在源文件(.java)中,在编译成字节码文件(.class)时,注解信息会被丢弃。也就是说,编译器在编译过程中不会将此类注解的信息存储到字节码文件中,运行时更无法获取到这类注解。
- 适用场景:适用于一些仅在编译期起作用的注解,例如一些用于代码检查、生成辅助代码等场景。比如,
@Override
注解,它主要是让编译器检查方法是否真的重写了父类方法,编译完成后就不再需要该注解信息,所以使用SOURCE
策略。
2. RetentionPolicy.CLASS
- 注解生命周期:此取值意味着注解会保留在字节码文件中,但在运行时JVM不会加载该注解信息。即从源文件编译成字节码文件时,注解信息会被保留在字节码中,但在运行时,程序无法通过反射等机制获取到该注解。
- 适用场景:常用于一些需要在字节码层面进行处理,但运行时不需要获取注解信息的场景。例如,一些字节码增强框架,它们在编译后对字节码进行处理,利用这类注解来标识需要增强的类或方法,处理完后运行时并不需要再访问这些注解,像AspectJ框架在某些场景下可能会用到这种注解保留策略。
3. RetentionPolicy.RUNTIME
- 注解生命周期:该取值表明注解不仅会保留在源文件和字节码文件中,在运行时JVM也会加载该注解信息,程序可以通过反射机制在运行时获取到注解的详细信息。
- 适用场景:适用于运行时需要根据注解信息进行动态处理的场景。例如,Spring框架中使用的
@Component
、@Autowired
等注解,Spring容器在运行时通过反射获取这些注解信息,从而完成Bean的注册、依赖注入等操作。又如,自定义的权限控制注解,在方法调用时,通过反射获取方法上的权限注解信息,进行权限校验。