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。