02. 注解与反射.md

02. 注解与反射.md

大鱼 397 2021-05-11

注解与反射

1. 使用

  1. @Target(ElementType.TYPE) 指明注解可用的地方,类、方法、变量…
  2. @Retention(RetentionPolicy.SOURCE) 注解的保留级别
    • SOURCE级别: 用于APT技术(案例),javac 过程中执行,编译期获取注解与注解类中的信息,一般用于生成额外的辅助类。或者语法检查@IntDef(需要学习) @DrawableRes等
    • CLASS级别:字节码增强,例如字节码插桩,热修复等
    • RUNTIME级别:运行期间通过反射技术动态获取注解及其元素、完成逻辑判定
  3. @interface Lance

2. APT技术

  1. 创建java module 主app依赖
  2. 创建XXXProcessor类文件,继承于AbstractProcessor, 重写必要方法, 类上声明要处理的注解@SupportedAnnotationTypes(“com.xxx.Lance”)
  3. 在resource文件夹下新建META_INF/service/javax.annotation.processing.Processor文件, 文件中写入XXXProcessor的全地址

3. 反射

  1. 常用方法
  2. getFiled 与 getDeclaredFiled
    • getFiled方法: 获取自己+父类的成员(不包括private,只能是public)。
    • getDeclaredFiled: 只能获取自己的成员,不包括父类, 可通过getSuperClass再去找

4. 注解和反射联用

  1. 新建注解, 变量标注注解
  2. class.getDeclaredFileds 获取成员
  3. declaredFiled.isAnnotationPresent(InjectView.class)判断是否添加了该注解
  4. InjectView inject = declaredFiled.getAnnotation(InjectView.class)获取注解
  5. inject.value获取注解变量
  6. declaredFiled.setAccessible(true) 允许操作私有属性
  7. declaredFiled.set(activity, view) 设置值