ButterKnife题后话

来源:互联网 发布:国通交规软件下载 编辑:程序博客网 时间:2024/06/10 02:43

【参考链接】

注解入门:反射+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+反射的方式,他在编译时生成一个新的类,然后在运行时只需要对使用注解的元素所在的类进行一次反射。

显然后者对于效率的影响要小很多。

 

 

原创粉丝点击