分分钟带你读懂ButterKnife的源码

  
  

为什么要写这一系列的博客呢?

     

因为在Android开发的过程中,泛型,反射,注解这些知识进场会用的到,几乎所有的框架至少都会用到上面的一两种知识,如Gson就用到泛型,反射,注解,改造也用到泛型,反射,注解。学好这些知识对我们进阶非常重要,尤其是阅读开源框架源码或者自己开发开源框架。

  

<>强前言

  

ButterKnife这个开源库火了有一段时间了,刚开始它的实现原理是使用反射实现的,性能较差。再后面的版本中逐渐使用注解+放射实现,性能提高了不少。

  

ButterKnife是基于编译时的框架,它能够帮助我们减去每次写FindViewById的麻烦,截止到2017.5.1,在github上面的开始已经超过15000 .

  

本篇博客要分析的ButterKnife的源码主要包括以下三个部分,版本号是8.5.1

  
      <李> butterknife-annotations李   <李> butterknife-compiler李   <李> butterknife李   
  

其中butterknife-annotations库主要用来存放自定义注解;butterknife-compiler主要是用来扫描哪些地方使用到我们的自定义注解,并进行相应的处理,生成模板代码等;butterknife主要是用来注入我们的代码的。

  

我们先来先一下要怎样使用butterknife:
<强> butterknife的基本使用
在模组的构建。gradle增加依赖

  {
 <代码>依赖关系
  编译com.jakewharton: butterknife: 8.5.1的
  annotationProcessor com.jakewharton: butterknife-compiler: 8.5.1的
  } 
  
 <代码>公共类SimpleActivity延伸活动{
  私有静态最终ButterKnife.ActionALPHA_FADE=new ButterKnife.Action () {
  @Override公共无效申请(@NonNull视图视图,int指数){
  AlphaAnimation AlphaAnimation=new AlphaAnimation (0,1);
  alphaAnimation.setFillBefore(真正的);
  alphaAnimation.setDuration (500);
  alphaAnimation。setStartOffset(指数* 100);
  view.startAnimation (alphaAnimation);
  }
  };
  
  @BindView (R2.id.title) TextView标题;
  @BindView (R2.id.subtitle) TextView副标题;
  @BindView (R2.id.hello)按钮你好;
  @BindView (R2.id.list_of_things) ListView listOfThings;
  @BindView (R2.id.footer) TextView页脚;
  
  @BindViews ({R2.id。标题、R2.id。副标题,R2.id。你好})ListheaderViews;
  
  私人SimpleAdapter适配器;
  
  @OnClick (R2.id.hello)无效sayHello () {
  吐司。makeText(这个,“你好,意见!”LENGTH_SHORT),告诉();
  ButterKnife。应用(headerViews ALPHA_FADE);
  }
  
  @OnLongClick (R2.id.hello)布尔sayGetOffMe () {
  吐司。makeText(这个,“放开我!”LENGTH_SHORT),告诉();
  返回true;
  }
  
  @OnItemClick (R2.id.list_of_things)无效alt="分分钟带你读懂ButterKnife的源码”> 
我们知道ButterKnife自定义很多的注解,有BindArray, BindBitmap, BindColor, BindView等,这里我们以BindView为例子讲解就好了,其他的也是基本类似的,这里就不再讲解了。

  
 <代码>//编译时注解
  @Retention(类)//成员变量(包括枚举常量)
  @Target(字段)
  公共@ interface BindView {/* *视图的ID字段将被绑定。*/@IdRes int值();
  } 
  

<>强处理器解析器说明
我们先来看一些基本方法:在初始化方法里面得到一些辅助工具类,这样有一个好处,确保工具类是单例的,因为初始化方法只会在初始化的时候调用。

  
 <代码>公共同步空白init (ProcessingEnvironment env) {
  super.init (env);
  
  ---//辅助工具类
  elementUtils=env.getElementUtils ();
  typeUtils=env.getTypeUtils ();
  产品=env.getFiler ();
  
  ---
  } 
  

接着重写getSupportedAnnotationTypes方法,返回我们支持的注解类型。

  
 <代码> @Override
  公共SetgetSupportedAnnotationTypes () {
  Set类型=new LinkedHashSet<在();
  (Class<?Annotation>延伸;注释:getSupportedAnnotations ()) {
  types.add (annotation.getCanonicalName ());
  }//返回支持注解的类型
  返回类型;
  }
  
  私人Set分分钟带你读懂ButterKnife的源码