butterknife 源码分析

butterknife是一个快速Android视图注入框架,它的开发者是大名鼎鼎的Jake
Wharton。本文针对v6.1.0版本进行分析。

1. 功能介绍

Android开发中经常要获取各种各样的view,比如我们一般在activity的onCreate()方法中调用findViewById()方法获取view,然后再转换成我们需要的类型。这种做法会在类中包含大量“样板代码”,不利于维护和升级。

butterknife用来解决此类问题,它通过给view字段上添加一个Java注解,框架会自动注入这些字段。

1.1 注入方式

butterknife的注入方法与众不同,Java有很多依赖注入框架,比较有名的像Guice和Spring,此类注入框架非常强大,它们通过在运行时读取注解实现注入,依赖的生成和注入都需要依靠Java的反射机制,反射对于性能敏感的Android来说是一个硬伤,因此此类注入框架普遍应用于JavaEE开发。

butterknife同样使用注解来实现依赖注入,但它利用APT(Annotation Process Tool)在编译时生成辅助类,这些类继承特定父类或实现特定接口,程序运行时加载这些辅助类,调用相应接口完成依赖注入。

使用butterknife实现依赖注入的开销仅仅是在编译时刻做的注解处理,程序运行时的开销几乎可以忽略不计。

1.2 基本使用

给view字段添加@InjectView注解,参数为view的ID,butterknife会根据ID找到这个view,然后自动完成类型转换:

class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views…
}
}