type
status
date
slug
summary
tags
category
password
icon
⽤反射实现 ButterKnife
- 创建 @BindView 注解
- ⽤反射获取 Field[],然后找到加了 @BindView 的字段,⾃动调⽤ findViewById() 来绑定对象
依赖注⼊吗?
- 什么是依赖注⼊:把依赖的决定权交给外部,即依赖注⼊
- Dagger:外部的依赖图来决定依赖的值,对象⾃⼰只负责「索要」,⽽不负责指定值,所以Dagger 是依赖注⼊
- ButterKnife:⾃⼰决定依赖的的获取,只把执⾏过程交给 ButterKnife,所以只是⼀个视图绑定库,⽽不是依赖注⼊
Annotation Processing
- 理解 Annotation Processing 的原理:编译过程中读源码,然后⽣成新的代码⽂件,再放在⼀起进⾏编译
- 例如:
- Annotation Processing 的⽬的:⾃动⽣成这部分代码
⽤ Annotation Processing 实现 ButterKnife
需要通过注解在编译之前处理代码,就需要使用到在 app/build.gradle 中使用到 annotationProcessor 这个依赖参数,依赖的是一个纯 java 的项目,在其中完成如下
- Annotation Processing ⽤法:
resources/META-INF/services/javax.annotation.processing.Processor
- 继承 AbstractProcessor
- 重写 getSupportedAnnotationTypes() 和 process()
- annotaions: 程序中出现的已注册的 Annotations;roundEnv:各个 java ⽂件
- 依赖:annotationProcessor
- 先测试⽣成 java ⽂件的功能:
- javapoet
- 代码:
- ⾃动⽣成代码:
- 需要把 Annotation 单独拆成⼀个 java lib module,被主项⽬和 processor 分别依赖
- 还需要⼀个 lib module,依赖 annotation,把 bind 那些东⻄写在这⾥。主项⽬依赖 lib,lib 依赖 annotations。最终主项⽬中有两个依赖:lib 和 processor
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/1fca9260-b499-4f5d-bd68-6f69d067f5e6
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。