Butterknife用途
Butterknife的作用是減少code,不用再寫很多findViewById, setOnClickListener.
它不會提高代碼執(zhí)行效率,但是可以提高程序員的效率甘畅。而且Butterknife產生的代碼是java源代碼,而不是字節(jié)碼,便于調試。
Butterknife流程
- 在編譯階段硅瞧,apt會掃描java代碼中所有的注解,比如@Bind, @Click等等恕汇。
- 當發(fā)現一個類中包含了這些注解腕唧,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();
}