ButterKnife源码解析_注解处理器

2018-03-27  本文已影响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。

上一篇下一篇

猜你喜欢

热点阅读