注解处理器(Annotation Processor),是
javac的一个工具,用来在编译时扫描和处理注解。 一个注解处理器以Java代码(或者编译过得字节码)作为输入,生成.java文件作为输出。
接下来我们模仿ButterKnife 实现一个@BindView的注解来了解Java注解处理器的使用。

模块说明:
bindview-annotation:定义注解,@BindView。
bindview-compiler:定义注解处理器,处理被@BindView标记的代码,并在编译时生成xxxActivity_ViewBinding.java
bindview-api:工具类,调用xxxActivity_ViewBinding.java中的方法,实现View的绑定。
创建注解类BindView

在该module的build.gradle中添加如下代码:

创建BindViewProcessor


ClassCreatorProxy是创建Java代码的代理类:

创建注解工具类BindViewTool

在app模块的build.gradle中添加如下代码:

在MainActivity中使用注解:

运行后生成的代码(路径 app/build/generated/source/apt):

MainActivity_ViewBinding代码:

上面生成代码的部分,是通过字符串拼接,过程非常繁琐。接下来就介绍一种更优雅的方式,使用javapoet。
添加依赖:
dependencies{
implementation'com.squareup:javapoet:1.10.0'
}在ClassCreatorProxy中添加如下代码

在BindViewProcessor中调用:

相比用StringBuilder拼Java代码,明显简介很多,且生成的代码是一样的。