美文网首页
ButterKnife源码解析_注解处理器

ButterKnife源码解析_注解处理器

作者: 拙峰朽木 | 来源:发表于2018-03-27 10:33 被阅读40次

    ButterKnife源码系列:
    ButterKnife源码解析_注解处理器
    ButterKnife源码解析_注解处理器调试

    ButterKnife现在绝对是热度最高的java开源项目之一,但是却也是那些牛逼库中相对简单的,所以先拿他开始我们三方库源码解析之路。不过在解析源码之前得先了解下他们常用到的知识,比如注解,注解处理器,反射等。今天就先了解下注解处理器。

    注解处理器是(Annotation Processor Tool)是javac的一个工具,用来在编译时扫描和编译和处理注解(Annotation)。你可以自己定义注解和注解处理器去搞一些事情。一个注解处理器它以Java代码或者(编译过的字节码)作为输入,生成文件(通常是java文件)。这些生成的java文件不能修改,并且会同其手动编写的java代码一样会被javac编译。

    1、自定义个注解:

    
    //能够在属性上使用注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.CLASS)
    public @interface BindView {
        int value();
    }
    
    

    2、 生成个Java Library类型的module命名为compiler


    image.png

    3、创建一个继承AbstractProcessor的类

    public class TestProcessor extends AbstractProcessor {
    
    

    4、注册这个类
    可以通过auto-service自动注册

        implementation 'com.google.auto.service:auto-service:1.0-rc2'
    
    

    通过auto-service注解实现自动注册

    
    @AutoService(Processor.class)
    public class TestProcessor extends AbstractProcessor {
    
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
            return false;
        }
    }
    

    5、指定允许注解处理器处理的注解类型及java编译的版本

    //允许注解处理器处理的注解类型
    @SupportedAnnotationTypes("com.rongcheng.dnr.BindeView")
    @SupportedSourceVersion(SourceVersion.RELEASE_7)
    public class TestProcessor extends AbstractProcessor {
    
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
            return false;
        }
    }
    
    

    6、在process方法中实现我们想要做的事情。

     /**
         * @param set              使用了当前注解处理器允许处理注解的节点集合
         * @param roundEnvironment 环境
         * @return
         */
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
            messager.printMessage(Diagnostic.Kind.NOTE, "process");
            for (TypeElement typeElement : set) {
                Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(typeElement);
                for (Element element : elements) {
                    messager.printMessage(Diagnostic.Kind.NOTE, element.getSimpleName());
                }
            }
            return false;
        }
    

    process回返回两个参数,非常重要。Set<? extends TypeElement> set这里面记录了所有你允许当前注解处理器处理的注解节点比如@BindView,RoundEnvironment是个类似全局环境通过它的getElementsAnnotatedWith(TypeElement var1)能找到指定注解在哪些地方用到了,返回个Set。

    相关文章

      网友评论

          本文标题:ButterKnife源码解析_注解处理器

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