ButterKnife题后话

【参考链接】

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

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

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值