【参考链接】
注解入门:反射+APThttp://www.jianshu.com/p/dce26aa75060
思考一个问题,在ButterKnife中有使用反射吗?
当然有的,在加载上MainActivityBindingView类以后,是通过反射获取到它的构造函数,然后进行调用的。
但我在查找资料的过程中,也看到了另外一种依赖注入的实现方式,即参考链接中的
定义注解如下
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public@interface IView {
intvalue()default0;
}
通过如下方式来使用
publicclassReflectActivityextendsAppCompatActivity{
@IView(R.id.tv)
TextView tv;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
InjectUtil.bind(this);
tv.setText("ReflectActivity");
}
}
如何解析呢
publicclassInjectUtil {
publicstaticvoidbind(Activity activity){
Class<? extends Activity> clazz = activity.getClass();
//遍历所有的字段
for (Field field :clazz.getDeclaredFields()) {
//处理字段
if(field.isAnnotationPresent(IView.class)) {
IView anno = field.getAnnotation(IView.class);
intvalue = anno.value();
try {
field.setAccessible(true);
field.set(activity,activity.findViewById(value));
}catch(IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
可以看出来,这是一种纯反射的方式,对于每个使用注解的元素都要进行一次(甚至多次)反射。
而ButterKnife是一种APT+反射的方式,他在编译时生成一个新的类,然后在运行时只需要对使用注解的元素所在的类进行一次反射。
显然后者对于效率的影响要小很多。