java注解的使用

1.创建注解处理Processor,需要继承 AbstractProcessor
如: TestProcessor extends AbstractProcessor
@SupportedAnnotationTypes("注解全路径名"): 指定该注解处理器只处理某个注解

2.注册自定义的processor(IDE Android Studio)
新建resources,目录下新建META-INF文件夹,目录下新建services文件夹,目录下新建javax.annotation.processing.Processor文件,然后将我们自定义注解处理器的全类名写到此文件:
src
 --main
  ---resources
   ----META-INF
     -----services
     ------javax.annotaion.processing.Processor(文件,里面写上自定义processor的全类名)


image.png

3.在build.gradle中配置该注解的工程
annotationProcessor “:compiler(有注解处理器的工程)”

4.保留时期
注解保留时期分 RetentionPolicy.SOURCE,RetentionPolicy.CLASS,RetentionPolicy.RUNTIME
1).SOURCE,技术:APT 在编译期能够获取注解与注解声名的类,包括类中的所有成员信息,一般用于生成额外的辅助类。
a.发生时机
.java->javac->.class
注解处理器不用我们人为的调用,在编译阶段会被调用,然后生成相应的.class文件
b. 应用场景
常见的三方工具,如butterknife生成相应的findViewById的代码就是在这个阶段;ARouter.
语法检查,如@IntDef(元注解,用于指定变量或参数的范围) ,@DrawableRes等,此种类型的注解处理是由IDE或其插件实现的语法检查

    @IntDef({SUNDAY, MONDAY})
    @Target({ElementType.FIELD, ElementType.PARAMETER})
    @Retention(RetentionPolicy.SOURCE)
    @interface WekDay {  //注解
     }
    public static void setCurrentDay(WeekDay currentDay) {
        mCurrentDay = currentDay;
    }

2).CLASS 技术:字节码增强 (ASM,javassist),在编译出.class后,通过修改Class数据以实现修改代码逻辑的目的,对于是否需要修改的区分或者修改为不同逻辑的判断可以使用注解
字节码增加,通俗理解,在字节码中写代码,在编译为.class后,生成.dex之前,对该字节码进行修改

3)RUNTIME 技术:反射 在程序运行期间,通过反射技术动态获取注解与其元素,从而完成不同的逻辑判定
定义注解,放到指定的变量上,通过反射拿到指定类的所有变量,判断变量是否有指定的注解,对其进行处理
古老框架:AA,以之最早的一些类ButterKnife的工具,在运行时,对View进行初始化。

你可能感兴趣的:(java注解的使用)