专栏名称: 刘望舒
腾讯云最具价值专家
目录
相关文章推荐
鸿洋  ·  务必立即拿下软考证(政策红利) ·  21 小时前  
复利大王  ·  冷暴力女王,翻车了 ·  22 小时前  
复利大王  ·  520怀孕事件? ·  22 小时前  
复利大王  ·  卷疯了:食堂档口末位淘汰 ·  昨天  
复利大王  ·  王石最新朋友圈 ·  昨天  
51好读  ›  专栏  ›  刘望舒

自定义注解和解析器实现ButterKnife

刘望舒  · 掘金  · android  · 2018-02-07 04:01

正文

请到「今天看啥」查看全文


注意这里我加了两个注解:用于修饰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的简单使用 , 不然可能难以读懂接下来的代码。







请到「今天看啥」查看全文


推荐文章
复利大王  ·  冷暴力女王,翻车了
22 小时前
复利大王  ·  520怀孕事件?
22 小时前
复利大王  ·  卷疯了:食堂档口末位淘汰
昨天
复利大王  ·  王石最新朋友圈
昨天
法律读库  ·  嗨!你是治愈派律师吗?
8 年前