ButterKnife源码解析

  • 时间:
  • 浏览:0
  • 来源:彩神大发11选5_神彩大发11选5官方

 编译时 Annotation 指 @Retention 为 CLASS 的 Annotation,由编译器自动解析。需用做的

OnClick注解中@Target(METHOD)表示该注解没人用于法律依据 上;

BindView注解定义

newBuilder生成了Builder对象,Builder对象定义了生成的Java文件名、mView所属对象的类型等。Builder对象生产后,parseBindView就根据@BindView注解信息生成FieldViewBinding对象,之后调用了Builder.build()函数;@BindView的解析但会 完成后,最后通过BindingSet.brewJava来生成上边文件。@BindView在生成文件对应了如下:

里能都看,上边文件里完成了对Target中成员变量的注入。

process函数先调用findAndParseTargets生成bindingMap,但会 通过binding.brewJava老生成Java文件。findAndParseTargets的实现如下(这里只关注@BindView和@OnClick):

findAndParseTargets

生成的上边文件如下所示:

下面对@BindView和@OnClick本身注解的解析进行讲解。编译时注解的解析:

上边文件

ListenerClass

getOrCreateBindingBuilder

bind函数根据调用的类名查找其对应的className_ViewBinding的类名,但会 反射调用其构造函数。

ButterKnife(https://github.com/JakeWharton/butterknife)是一款android平台的依赖注入框架,通过该工具里能实现View、OnClickListener的注入,省去了findViewById、setOnClickListener的过程。使用法律依据 如下:

ButterKnifeProcessor.process()函数如下:

其中调用parseBindView对注解为@BindView的Field进行解析;findAndParseListener对@OnClick相似的Listener注解进行解析。parseBindView代码如下:

BindView注解定义中使用了元注解@Retention(CLASS)定义了该注解只保留到编译期间,运行还会丢弃;@Target(FIELD)表示该注解没人用在成员变量上边。

ButterKnifeProcessor

    a. 自定义类集成自 AbstractProcessor(编译器在编译时自动查找所有继承自 AbstractProcessor 的类,但会 调用当我们 的 process 法律依据 去解决)

ListenerClass是一另一个@Target(ANNOTATION_TYPE)类型的注解,表示ListenerClass没人用在注解上;且@Retention(RUNTIME)表示该注解里能保留到JVM中,也而是运行时不需要 通过反射来获取。

parseBindView

parseBindView的主要工作是创建了BindingSet.Builder。getOrCreateBindingBuilder()如下:

    b. 重写其中的 process 函数

addViewBinding

ButterKnife实现了ButterKnifeProcessor来进行编译时注解的解析:

至此,ButterKnife的@BindView的运行流程而是从前。

通过@BindView注解实现findViewById的功能,完成View注入;通过@OnClick完成OnClickListener点击事件的注入,给ID对应的View设置点击事件和响应函数。关于注解的定义和解析里能参照这篇文章:Java注解。ButterKnife使用的而是编译时解析注解的技术,在编译时对注解进行解析,生成上边文件,在ButterKnife.bind时引用注解编译器生成的上边文件,完成依赖注入。

getOrCreateBindingBuilder内部管理调用了BindingSet.newBuilder。

BindingSet.newBuilder

没人上边文件又是在哪几种之后被调用的呢?答案而是ButterKnife.bind(this)

OnClick注解

ButterKnifeProcessor.process