ButterKnife原理

  1. Butterknife 简介
    Butterknife是一款Android系统的注入式框架,通过注解处理器(annotationProcessor技术),在项目编译的 时候生成XXXActivity_ViewBinding辅助类。
    框架中使用到的注解并不是在运行时的反射,而是编译时生成新的class,所以对整个项目的性能基本没有太 大的损失。
  2. Butterknife 优势
    代码简洁,结构清晰,可读性强,提高代码效率。
    运行时不会影响APP效率,使用配置方便。
  3. 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()方法中,可以看到首先判断缓存中是否有对应的unbinder

    1
    2
    Map<Class<?>, Constructor<? extends Unbinder>> BINDINGS = new LinkedHashMap<>();//缓存对应的class及constructor以提高效率。
    Constructor<? extends Unbinder> bindingCtor = BINDINGS.get(cls);//获取对应cls的构造器