正文
注意这里我加了两个注解:用于修饰MainActivity的NeedBind和用于修饰mTv的BindView。另外很重要的一点就是mTv变量
不能
用private修饰,因为我们是通过在生成的代理类中调用MainActivity.view=(View)MainActivity.findViewById()来实现为view绑定id的,所以mTv至少需要是package可见级别的。现在还没有解析我们自定义的注解,因此现在加的注解是没有任何作用的,那么接下来就开始实现我们的注解解析器吧。
还是在processor module下,新建类
MyButterKnifeProcessor
,继承自
AbstractProcessor
.这个就是用于解析自定义注解的解析器了。不过要想让它生效还必须在processor下新建如下的目录结构:
并新建名为
javax.annotation.processing.Processor
的文本文件,内容就一行:
me.mrrobot97.lib.MyButterKnifeProcessor
还需要修改app module的build.gradle文件,加入:
compile project(path: ':processor')annotationProcessor project(path: ':processor')
这么做是为了让编译器使用我们的解析器用于解析注解。
后面的工作都是在
MyButterKnifeProcessor
类里实现了。我们的目的是通过读取类中的自定义注解,生成相应的绑定视图的代码,这就需要一个生成java代码的库javapoet, squre出品,质量绝对上乘。在processor的build.gradle里加入如下一行:
compile 'com.squareup:javapoet:1.9.0'
ps:这么实用的开源项目在github上居然才4500start,还没有最近火的微信跳一跳小游戏辅助脚本的star多,我也是醉了。可见github的star还是很水的,看看就好,千万别用star数目判断一个项目是否牛逼……
MyButterKnifeProcessor里需要重写方法
process()
和方法
getSupportedAnnotationTypes()
:
public class MyButterKnifeProcessor extends AbstractProcessor{ @Override public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { for(Element element:roundEnvironment.getElementsAnnotatedWith(NeedBind.class)){ generateBinderClass((TypeElement) element); } return true; } @Override public Set<String> getSupportedAnnotationTypes() { return Collections.singleton(NeedBind.class.getCanonicalName()); }}
然后就到了本文的关键:处理注解并生成辅助类。
强烈建议
读者先阅读
javapoet的简单使用
, 不然可能难以读懂接下来的代码。