@Retention注解的应用场景
1,SOURCE:在源文件中有效(即源文件保留)
2.CLASS:在class文件中有效(即class保留)
3.RUNTIME:在运行时有效(即运行时保留)
源码:
APT: 在编译期能够获取注解与注解声明的类包括类中所有的成员信息,一般用于生成额外的辅助类。
IDE语法检查:在android开发中,(support-annotations与androidx.annotation)中均有提供@IntDef注解,次注解的定义如下:
@Retention(SOURCE)
@Target({ANNOTATION_TYPE})
public @interface IntDef {
int[] value() default {};
boolean flag() default false;
boolean open() default false;
}
java中Enum(枚举)的实质是特殊单例的静态成员变量,在运行期所有枚举类作为单例,全部加载到内存中。比常量多5到10倍的内存占用。
此注解的意义在于能够取代枚举,实现方法入参限制。
如:我们定义方法test,此方法接收参数teacher需要在:aaa,bbb中选择一个,如果使用枚举实现为:
public enum Teacher{
aaa,bbb
}
public void test(Teacher teacher) {
}
而现在为了进行内存优化,我们现在不在使用枚举,则方法定义为:
public static final int AAA = 1;
public static final int BBB = 2;
public void test(int teacher) {
}
然而此时,调用test方法由于采用基本数据类型int,将无法进行类型限定,此时使用@IntDef增加自定义注解:
public static final int AAA = 1;
public static final int BBB = 2;
@IntDef(value = {AAA,BBB}) //限定为aaa,bbb
@Target(ElementType.PARAMETER) //作用于参数的注解
@Retention(RetentionPolicy.SOURCE) //源码级别的注解
public @interface Teacher {
}
public void test(@Teacher int teacher) {
}
此时,我们再去调用test方法,如果传递的参数不是AAA或者BBB则会显示Inspection警告(编译不会报错)。
可以修改此类语法检查级别:
以上注解均为SOURCE级别,本身IDEA/AS都是由java开发的,工具实现了对java语法的检查,借助注解能对被注解的特定语法进行额外检查。
字节码:
字节码增强:在编译出Class后,通过修改Class数据以实现修改代码逻辑目的,对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解。
运行时:
反射:在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定。