参考文章 :
前言 :
- 今天看ButterKnife源码发现其内部还是用到了findViewById和反射, 只不过加了一个缓存, 只有第一次调用bind时使用反射, 后边再次调用bind时从缓存中取;
一、实际调ButterKnife.bind :
1.1 ButterKnife.bind :
ButterKnife.bind
- 1、从BINDINGS中取出Unbinder, 如果target对应的Unbinder存在, 则直接使用, 反之则通过反射获取Unbinder对象;
- 2、target对应ButterKnife.bind传入的Activity, 也就是如果在Activity中第一次调用过ButterKnife.bind时, 会使用反射, 之后都是从缓存中取Unbinder;
1.2 Unbinder.newInstance :
Unbinder.newInstance
- 可以看到ButterKnife内部还是用到了findViewById;
二、ButterKnife注解处理器:
- 实际使用时, ButterKnife.bind源码比较简单, 而且用起来也简单, 比大量的显示调用findViewById要好很多, 接下来分析一下关于这个ButterKnifeTest_ViewBinding是如何产生的;
2.1 Activity.BindView :
public class ButterKnifeTest extends Activity {
BindView(R.id.butterKnifeTextView)
TextView mTextView;
protected void onCreate(Bundle savedInstanceState) {
ButterKnife.bind(this);
}
}
2.2 ButterKnifeProcessor.process :
ButterKnifeProcessor.process
- 1、编译时, 编译器会调用ButterKnifeProcessor的process方法;
2.3 ButterKnifeProcessor.findAndParseTargets:
网友评论