美文网首页
ButterKnife 解读

ButterKnife 解读

作者: WolfMan90 | 来源:发表于2019-12-19 17:09 被阅读0次

    第一源代码下载:https://github.com/JakeWharton/butterknife 

    ButterKnife原理分析:ButterKnife它用了Java Annotation Processing技术,就是在Java代码编译成Java字节码的时候就已经处理了@Bind、@OnClick(ButterKnife还支持很多其他的注解)这些注解了。

    Java AnnotaJtion Processing是java中用于编译时扫描和解析Java注解的工具

    Annotation processing是在编译阶段执行的,它的原理就是读入Java源代码,解析注解,然后生成新的Java代码。新生成的Java代码最后被编译成Java字节码,注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法。下图是Java 编译代码的整个过程,可以帮助我们很好理解注解解析的过程:

    工作流程

    编译之后会生成 MainActivity_ViewBinding 文件

    看一下这个MainActivity_ViewBinding 

    MainActivity 和 MainActivity_ViewBinding 是怎么关连起来的呢?就是通过ButterKnife.bind(this) 这一行代码。进入ButterKinfe  bind()方法看                                                   

    通过bind 传入targer对象,和 viewRoot,在通过ClassLoader查找className_ViewBinding的文件,之后通过 constructor.newInstance(target, source) 将target(MainActivity)source (DecorView)创建className_ViewBinding的实例对象。在对象的构造函数对targer.xx 进行初始化,这就是为什么定义注解的变量不能是private修饰的因。有些注入框架你是可以把view设置成private的,答案就是性能。如果你把view设置成private,那么框架必须通过反射来注入view,不管现在手机的CPU处理器变得多快,如果有些操作会影响性能,那么是肯定要避免的,这就是ButterKnife与其他注入框架的不同。

    细节解释,bind() 传入的target 不能是java.  android. 和androidx. 为包名开头的类

    相关文章

      网友评论

          本文标题:ButterKnife 解读

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