参考:
http://bxbxbai.github.io/2016/03/12/how-butterknife-works/?utm_source=tuicool&utm_medium=referral
理解原理:
发现ButterKnife的原理不是:
在 bind(this)
方法执行的时候通过反射获取Activity
中所有的带有 @Bind
注解的属性并且获得注解中的 R.id.xxx
值,
最后还是通过反射拿到 Activity.findViewById()
方法获取View,并赋值给 Activity
中的某个属性
这是一个注解库的实现方式,比较原始
缺点:在Activity运行时大量使用反射会影响App的运行性能,造成卡顿以及生成很多临时Java对象更容易触发GC
ButterKnife
实际是用了Java Annotation Processing技术【Annotation processing 是javac中用于编译时 扫描 和 解析Java注解的工具】
就是在Java代码编译成Java字节码的时候就已经处理了 @Bind
、 @OnClick
(ButterKnife还支持很多其他的注解)这些注解了
-----------------割------------------------------
Annotation processing是在编译阶段执行的,
原理:读入Java源代码——解析注解——生成新的Java代码——被编译成Java字节码
注解解析器(Annotation Processor)不能改变读入的Java 类,比如不能加入或删除Java方法
ButterKnife 工作流程
当你编译你的Android工程时,ButterKnife工程中 ButterKnifeProcessor
类的 process()
方法会执行以下操作:
- 开始它会扫描Java代码中所有的ButterKnife注解
@Bind
、@OnClick
、@OnItemClicked
等 - 当它发现一个类中含有任何一个注解时,
ButterKnifeProcessor
会帮你生成一个Java类,名字类似<className>$$ViewBinder
,这个新生成的类实现了ViewBinder<T>
接口 - 这个
ViewBinder
类中包含了所有对应的代码,比如@Bind
注解对应findViewById()
,@OnClick
对应了view.setOnClickListener()
等等 - 最后当Activity启动
ButterKnife.bind(this)
执行时,ButterKnife会去加载对应的ViewBinder
类调用它们的bind()
方法
用@Bind
、@OnClick
等注解标注的属性或方法必须是public或protected的,因为ButterKnife是通过ExampleActivity.this.editText
来注入View的,否则如果是priivate 就得用反射了,会影响性能
优势:绑定view,设置监听特别容易
还不会多么影响性能
不过感觉可读性不是很强····
关于如何在AS中配置和使用ButterKnife:请看
http://blog.csdn.net/a873228446/article/details/51831754
写的特别吼