Butterknife 简介
Butterknife是一款Android系统的注入式框架,通过注解处理器(annotationProcessor技术),在项目编译的 时候生成XXXActivity_ViewBinding辅助类。
框架中使用到的注解并不是在运行时的反射,而是编译时生成新的class,所以对整个项目的性能基本没有太 大的损失。Butterknife 优势
代码简洁,结构清晰,可读性强,提高代码效率。
运行时不会影响APP效率,使用配置方便。Butterknife原理分析
先从ButterKnife.bind开始分析,不论何种形式的bind最后都会调用createBinding()这个方法
返回一个Unbinder对象。1
2
3
4@NonNull @UiThread
public static Unbinder bind(@NonNull Object target, @NonNull View source) {
return createBinding(target, source);
}继续跟进到createBinding方法中看看下面的代码内容,首先target得到绑定的Activity的class,然后通过findBindingConstructorForClass(class)方法得到一个继承自Unbinder的Constructor(构造器),
1
Constructor<? extends Unbinder> constructor = findBindingConstructorForClass(targetClass);
然后通过反射 constructor.newInstance(target,source)得到一个unbinder的一个实例返回。
继续跟进到findBindingConstructorForClass()方法中,可以看到首先判断缓存中是否有对应的unbinder1
2Map<Class<?>, Constructor<? extends Unbinder>> BINDINGS = new LinkedHashMap<>();//缓存对应的class及constructor以提高效率。
Constructor<? extends Unbinder> bindingCtor = BINDINGS.get(cls);//获取对应cls的构造器