注解与反射
1. 使用
- @Target(ElementType.TYPE) 指明注解可用的地方,类、方法、变量…
- @Retention(RetentionPolicy.SOURCE) 注解的保留级别
- SOURCE级别: 用于APT技术(案例),javac 过程中执行,编译期获取注解与注解类中的信息,一般用于生成额外的辅助类。或者语法检查@IntDef(需要学习) @DrawableRes等
- CLASS级别:字节码增强,例如字节码插桩,热修复等
- RUNTIME级别:运行期间通过反射技术动态获取注解及其元素、完成逻辑判定
- @interface Lance
2. APT技术
- 创建java module 主app依赖
- 创建XXXProcessor类文件,继承于AbstractProcessor, 重写必要方法, 类上声明要处理的注解@SupportedAnnotationTypes(“com.xxx.Lance”)
- 在resource文件夹下新建META_INF/service/javax.annotation.processing.Processor文件, 文件中写入XXXProcessor的全地址
3. 反射
- 常用方法
- getFiled 与 getDeclaredFiled
- getFiled方法: 获取自己+父类的成员(不包括private,只能是public)。
- getDeclaredFiled: 只能获取自己的成员,不包括父类, 可通过getSuperClass再去找
4. 注解和反射联用
- 新建注解, 变量标注注解
- class.getDeclaredFileds 获取成员
- declaredFiled.isAnnotationPresent(InjectView.class)判断是否添加了该注解
- InjectView inject = declaredFiled.getAnnotation(InjectView.class)获取注解
- inject.value获取注解变量
- declaredFiled.setAccessible(true) 允许操作私有属性
- declaredFiled.set(activity, view) 设置值
上一篇
CentOS7 + MySQL 5.7.32 快捷安装
下一篇
01. 泛型.md