为什么要写这一系列的博客呢?
引用>因为在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。你好})List headerViews; 私人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的源码