Butterknife用途
Butterknife的作用是减少code,不用再写很多findViewById, setOnClickListener.
它不会提高代码执行效率,但是可以提高程序员的效率。而且Butterknife产生的代码是java源代码,而不是字节码,便于调试。
Butterknife流程
- 在编译阶段,apt会扫描java代码中所有的注解,比如@Bind, @Click等等。
- 当发现一个类中包含了这些注解,Butterknife会产生一个java类,名字为<className>$$ViewBinder。这个类包含了findViewById, setOnClickListener等代码。
- 在程序运行时,通过ButterKnife.bind(this), 利用刚才产生的代码完成注入。
Butterknife原理
Butterknife是注入框架的一种。一般的注入框架使用的runtime annotation。在运行的时候通过反射完成注入。这种方式比较简单直接,但是反射会影响性能。反射本身效率不高,同时产生大量临时变量,增加了GC的压力。
Butterknife使用的是另一种方式,即APT(annotation processor tool)。这种方式是在编译阶段,根据annotation产生一些java class。然后在运行时,通过这些类完成注入。所以Butterknife只是替代了程序员写了一些code。
APT流程:
Butterknife的代码是通过javapoet产生的。
Annotation
因为Butterknife利用的是annotation,所以看一下注解的使用方式:
1、标准Annotation
标准的Annotation,我们经常用的@Override、@Deprecated、@SuppressWarnings,这些是java自带的几个Annotation,分别表示重写函数、不鼓励使用、忽略某项Warning。
2、元Annotation
元Annotation是指用来定义Annotation的Annotation,一般我们自定义Annotation时就会用到。主要包括以下几个:
@Retention 保留时间,可选值SOURCE(源码时),CLASS(编译时),RUNTIME(运行时),默认为CLASS,值为SOURCE大都为MarkAnnotation,这类Annotation大都用来校验,比如Override,Deprecated,SuppressWarnings
@Target可以用来修饰哪些程序元素,如TYPE,METHOD,CONSTRUCTOR,FIELD,PARAMETER等,未标注则表示可修饰所有
@Inherited是否可以被继承,默认为false
一个自定义注解示例
@Retention(CLASS)
@Target(FIELD)
public @interface BindView {
/** View ID to which the field will be bound. */
@IdRes int value();
}