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+反射的方式,他在编译时生成一个新的类,然后在运行时只需要对使用注解的元素所在的类进行一次反射。
显然后者对于效率的影响要小很多。
- ButterKnife题后话
- tengine后话
- “开源”之后话开源
- “开源”之后话开源
- ButterKnife
- ButterKnife
- ButterKnife
- ButterKnife
- ButterKnife
- ButterKnife
- ButterKnife
- butterknife
- ButterKnife
- ButterKnife
- Butterknife
- butterknife
- ButterKnife
- ButterKnife
- node+express下获取请求参数
- 系分教程第一章 绪论 笔记一
- 使用Pods报_OBJC_CLASS_$_XXX解决
- Banner实现图片轮播
- 文章标题
- ButterKnife题后话
- Shiro的URL匹配规则(AntPathMatcher)
- Scala入门到精通——第九节 继承与组合
- 《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?
- Tomcat内存溢出解决办法
- zigbee学习笔记---Channel、PANID、发射功率及其它参数
- python检测mysql状态脚本--参考
- Java内存模型
- 20170629