ButterKnife框架生成了一个辅助类MainActivity_ViewBinding,那么该类是如何生成的呢?答案是:注解处理器在编译阶段生了该辅助类。实现一个注解处理器,需要继承抽象类AbstractProcessor,并重写init,getSupportedAnnotationTypes,getSupportedSourceVersion,getSupportedOptions,process五个方法。在process方法中,会对应用源代码中ButterKnife相关的注解进行扫描并解析其内容,将相关数据存放在一个Map集合中,最后使用Java Poet提供的JavaFile类,将集合中数据串接成字符串生成Java文件
工作流程如下:
- 扫描Java代码中所有的ButterKnife注解@Bind, @OnClick, @OnItemClicked等
- 当发现类中含有任何一个注解时,ButterKnifeProcessor会生成一个Java类, 名字类似$$ViewBinder,新生成的类实现了ViewBinder接口
- ViewBinder类中包含了所有对应的代码,如@Bind注解对应findViewById(), @OnClick对应了view.setOnClickListener()
- 当Activity启动ButterKnife.bind(this)执行时,ButterKnife会加载对应的ViewBinder类调用它们的bind()方法。