美文网首页
三分钟手写Butter Knife(通过注解和反射)

三分钟手写Butter Knife(通过注解和反射)

作者: 不服输的小蜗牛 | 来源:发表于2020-12-17 08:47 被阅读0次

ButterKnife,早起的android 程序员都知道有这么一个库,他的出现主要是为了少让我们写findviewByid(),现在的项目中findviewByid 这个很少能看到了。因为现在可以通过DataBinding技术直接实现双向绑定,也是google 推荐的做法。
今天我们是通过注解和反射的技术来实现类似Butter Knife的实现。
ButterKnife在使用的时候我们都知道是需要在查找控件上添加个注解@BindView(R.id.xxx),那么我们就需要先实现这个注解

一、注解类的实现

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindView {
    int value();
}

如果有对注解不理解的小伙伴可以到xxxxx去先查看注解的使用。

我们要知道一个原理性的东西,那就是我们只创建出来注解是没有用的,是需要结合我们实际情况拿到有注解的字段、方法、类,完成我们的逻辑需求的。

接下来我们就需要实现一个解析注解的类,是通过反射技术实现的。

二、解析类的实现

public class Bind {
    public static void binding(Activity activity) {
        Class<? extends Activity> aClass = activity.getClass();
        try {
            for (Field declaredField : aClass.getDeclaredFields()) {
                BindView bindView = declaredField.getAnnotation(BindView.class);
                if (bindView != null) {
                    declaredField.setAccessible(true);
                    declaredField.set(activity, activity.findViewById(bindView.value()));
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

我们通过静态的binding方法就可以来实现把activity中所有有BindView注解的字段给自动执行findViewByid().是不是特别简单。

不过以上代码只是demo,并不是ButterKnife 的真正实现。
反射大家都知道是会有性能消耗的,如果一两个字段通过反射来完成还好。但是如果用户界面有几十个view是通过反射来实现的那么就会造成明显的卡顿。
我们可以通过 AnnotationProcessor 来实现高性能的ButterKnife

相关文章

网友评论

      本文标题:三分钟手写Butter Knife(通过注解和反射)

      本文链接:https://www.haomeiwen.com/subject/douagktx.html