注解@Retention用来修饰注解,是注解的注解,称为元注解。
Retention注解有一个属性value,是RetentionPolicy枚举类型,决定了Retention注解应该如何去保持。RetentionPolicy有3个值:CLASS RUNTIME SOURCE
- RetentionPolicy.SOURCE:注解只保留在源文件中,编译时注解会被遗弃;
- RetentionPolicy.CLASS:注解会保留到class文件,当class文件被Load时被遗弃,这是注解默认的生命周期;
- RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,Load之后,仍然存在;
这3个生命周期分别对应于:源文件---> .class文件 ---> 内存中的字节码
如何选择呢?
首先,要明确生命周期长度 SOURCE < CLASS < RUNTIME ,所以前者能作用的地方后者一定也能作用。
- 如果需要在运行时去动态获取注解信息,那只能用 RUNTIME 注解
- 如果编译时需要依赖注解进行预处理,比如生成一些辅助代码等,如 ButterKnife,就用 CLASS注解;
- 如果只是做一些检查性的操作,比如 @Override 和 @SuppressWarnings,使用SOURCE 注解。一般是供IDE使用
网友评论