美文网首页
AnnotationProcessor实战:实现ButterKn

AnnotationProcessor实战:实现ButterKn

作者: 勇敢地追 | 来源:发表于2019-02-07 21:02 被阅读0次

    Note:

    本文只是对这篇文章的一个说明。也可以认作是本人对它的理解和认识

    1.问题引入

    我们现在需要实现findViewById,通常是这么写的

    TextView tv = (TextView) view.findViewById(R.id.tv_name);
    

    要实现findViewById,需要四个参数(控件类型,控件变量名,宿主view(通常是activity,我们一般省去),以及控件id)
    BindView 通常是如下使用的

    @BindView(R.id.tv_name)
    TextView mTv;
    

    此时,四个参数中已经有了三个参数,最后一个宿主参数可以另外传进去

    2.具体实现细节

    (1)ViewFinder和它的实现类ActivityViewFinder就是实现findViewById的,可以这么写,其实也可以直接写在AbstractProcessor里面
    (2)LCJViewBinder---使用静态类来管理变量和id的绑定和解绑
    可以看到最终的实现就是通过ViewBinder来实现的。具体的实现要等后面AbstractProcessor的实现
    (3)BindViewField是用来保存标注了BindView的信息的,也就是之前说的三个参数
    (4)AnnotatedClass 是用来管理所有BindViewField变量的
    (5)最后着重看一下AbstractProcessor的process的方法实现

        @Override
        public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
            mAnnotatedClassMap.clear();
            try {
                //遍历所有BindView注解
                //根据activity所在的全名生成AnnotatedClass
                //根据注解生成对应的BindViewField并且保存在对应的AnnotatedClass下
                processBindView(roundEnv);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
                error(e.getMessage());
            }
    
            for (AnnotatedClass annotatedClass : mAnnotatedClassMap.values()) {
                try {
                    //将找到的所有的BindView的信息写进java文件里面去
                    //需要对JavaPoet有一定的了解
                    annotatedClass.generateFile().writeTo(mFiler);
                } catch (IOException e) {
                    error("Generate file failed, reason: %s", e.getMessage());
                }
            }
            return true;
        }
    

    3.总结

    理解起来其实不是很困难,主要是有很多细节需要处理,另外还有不常用的库(JavaPoet)需要熟悉加了解

    相关文章

      网友评论

          本文标题:AnnotationProcessor实战:实现ButterKn

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