这个项目是什么
ProcessorDemo 是一个学习性质的项目,目标是把 ButterKnife 里 BindView 那一套功能自己实现一遍,借此理解 APT(Annotation Processing Tool,编译期注解处理)是怎么工作的。
README 的原话是"仿写ButterKnife的BindView功能,AOP思想的APT方式学习"。重点不在于做一个能替代 ButterKnife 的库,而在于把"写注解、编译期生成代码、运行时调用生成代码"这条链路完整走通。看懂之后,再去看 ButterKnife、Dagger、Room 这类框架,就不会觉得它们在变魔术了。
APT 的思路
ButterKnife 这类框架之所以快,是因为它不在运行时用反射找控件。大致流程是:
- 在字段上写注解,标记它对应哪个控件 id;
- 编译时,注解处理器扫描这些注解,生成一段普通的 Java 代码,内容就是
findViewById加类型转换; - 运行时调用生成的绑定类,走的是直接方法调用,没有反射开销。
反射版本的绑定写起来更省事,代码量也少,但每次都要在运行时解析注解、查找字段,性能和可混淆性都吃亏。APT 把这份工作提前到编译期,代价是要多维护一个 processor 模块,还要处理生成代码的命名、增量编译之类的问题。
这也解释了为什么很多主流库都选择在编译期生成代码:把不确定性留在构建阶段,运行时就只剩确定的分支。
适合谁看
如果你想搞清楚注解处理器到底在什么时候运行、能拿到哪些信息、生成的代码长什么样,这个仓库可以当作一个最小样本。README 没有给出使用说明,直接读代码比看文档更合适——先看注解的定义,再看 processor 里的处理逻辑,最后看生成出来的绑定代码,顺序理清了,整个机制也就清楚了。
仓库地址:tpnet/ProcessorDemo