美文网首页
ButterKnife与JavaPoet更配哦!

ButterKnife与JavaPoet更配哦!

作者: s1991721 | 来源:发表于2019-03-26 20:15 被阅读0次

前言

学习了注解相关的知识【注解那些事儿!】,总得拿东西练练手。

运行时的处理方式看看ViewInject框架满满的够了,因为反射相关的技能以前经常使用这里就不贴了。

编译时的处理方式,当属ButterKnife框架最能体现注解处理器的作用,顺带看下其架构模式。

我所查看的是ButterKnife8.8.1的版本,因为从9.0.0开始需要minSdkVersion>=24,而10.0.0+则需要androidX。这里只是学习注解处理器相关的操作和JakeWharton设计ButterKnife的编程思想,故选此版本。

ButterKnife概览

使用

添加依赖

添加依赖后便会在External Libraries看到

使用就很简单了,给控件添加注解,调用ButterKnife的bind方法,控件就赋值成功了。

查看源码

因为gradle使用了annotationProcessor,AS并不显示相关包内容

修改依赖方式,将butterknife-compiler作为一般库依赖,而非注解处理器

这时源码就出来了

源码结构

使用层面

外部调用ButterKnife.bind生成Unbinder对象,在Unbinder的构造方法内完成了注解控件的赋值。真就这么简单,以MainActivity为例

ButterKnife.bind通过查找名为“MainActivity_ViewBinding”的类,获取其构造方法生成MainActivity_ViewBinding对象,在MainActivity_ViewBinding的构造方法内对MainActivity内的控件变量进行赋值。

MainActivity_ViewBinding

编译层面

入口就不是ButterKnife.bind了

  • ButterKnifeProcessor对注解进行处理,生成多个BindingSet.Builder对象

  • 由BindingSet.Builder对象生成BindingSet对象(构造者模式),每一个Activity或控件容器都对应一个BindingSet对象(控件容器:Activity、Dialog、Fragment、自定义ViewGroup等)

  • 由BindingSet对象生成Java代码,交由Javapoet生成Java文件,即:使用层面的Unbinder类(MainActivity_ViewBinding)

源码

ButterKnifeProcessor既然是注解处理器,关键点无外乎三处getSupportedSourceVersion、getSupportedAnnotationTypes、process,纵使源码1493行,抓住关键点,源码中实际功能也没几行

饭前甜点

真正开始前,来个小知识。

源码中这2个常量、2个变量有没有注意到,与之相关的操作是processingEnvironment.getOptions().get(),明显是获取配置信息,翻遍源码也没找到其他地方使用,因为这是gradle中配置的,用于获取配置信息

    defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [butterknife_minSdk: "1.0", 
                             butterknife_debuggable: "1"]
            }
        }
    }

这是annotationProcessor方式的配置方法,apt因为被淘汰不贴了

由于我们应用的gradle没有此配置,故变量为默认值,方便后面源码阅读

process

有了之前的基础【注解那些事儿!】这里直接进入主题。

通过findAndParseTargets获得了BindingSet对象

findAndParseTargets中最初变量是BindingSet.Builder,明显后方做了处理,找个眼熟的看看

调用了parseBindView,传入了被注解对象和集合对象

基本信息被存入BindingSet.Builder对象中

这里涉及的注解操作,可作为未来操作的样本

可见BindingSet是有包含关系的,至此BindingSet对象就生成了

接着也一目了然,由BindingSet对象生成Java代码

BindingSet & JavaPoet

这里着重强调代码编写技巧,逻辑什么的太复杂了!!

包名、注释 类名、继承关系、变量、方法 注解、修饰词、参数、静态代码段 构造函数、入参 类型写法 类型、常量、字符串写法 类型、常量、字符串写法 类型、常量、字符串写法 类型、常量、字符串写法

相关文章

网友评论

      本文标题:ButterKnife与JavaPoet更配哦!

      本文链接:https://www.haomeiwen.com/subject/eewgmqtx.html