注解处理器(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代码,明显简介很多,且生成的代码是一样的。