概念和作用

注解处理器(Annotation Processor)是Java编程语言中的一种工具,用于在编译时处理特定的注解。代码在编译过程中会扫描源代码中的注解,然后调用对应的注解处理器解析和处理这些注解。

注解处理器可以用于以下目的:

  1. 生成代码:注解处理器可以在编译时生成新的代码,资源文件等,并将其加入到编译过程中。
  2. 代码验证:在编译时验证注解的使用是否符合特定规则,报告错误。如果注解处理器发现代码中的不正确使用,则可以发出编译错误,并阻止编译过程的继续。
  3. 自动化任务:注解处理器可以通过处理注解来自动执行一些重复性任务,从而提高开发效率。例如,生成数据库表与实体类之间的映射代码。

常见的库如,EventBus,Dagger,Retrofit 等都使用了注解处理器来生成代码。

AbstractProcessor是注解处理器的基类,它可以提供给开发者来自定义自己的注解处理器,在编译时处理注解。它是一个抽象类,封装了很多底层细节,为开发者提供了一种方便的方式来实现注解处理器处理注解。开发者只需要继承并实现其process方法,来定义如何处理特定的注解。所以总的来说开发中可以通过AbstractProcessor来快速实现一个自定义的注解处理器。下面介绍一下这个类的一些基本属性和方法。

AbstractProcessor介绍

AbstractProcessor是Java标准库的一部分官方文档 AbstractProcessor - Java SE 11 Documentation 跟随不同的Java版本。

关键方法

  1. public void init(ProcessingEnvironment processingEnv) 使用ProcessingEnvironment来初始化注解处理器,可以通过processingEnv参数获取很多有用的工具。该方法只能被调用一次,否则会抛出IllegalStateException异常。
  2. boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) 该方法继承至父类Processor的抽象方法,在AbstractProcessor中没有被覆写,需要用户覆写此方法。注解的处理过程主要在这个方法里面,比如生成代码,检查注解,发出警告等。

parameters: annotations - 请求处理的注解类型,即当前方法处理那些注解。

roundEnv - 当前和前一轮的环境信息。roundEnv.getElementsAnnotatedWith可以获取到指定注解对应的Element。通过roundEnv可以获取注解相关的各种信息。

Returns:

表明当前处理器是否处理了这些注解。如果返回true表明注解已经被处理,后续的注解处理器不会再处理他们。
  1. public Set<String> getSupportedAnnotationTypes() 表明处理器能够处理的注解类型。每个注解类型由其全限定名表示。如果没有支持的类型返回空集合。

    例子:
    @Override
    public Set<String> getSupportedAnnotationTypes(){
    	Set<String> annotations = new LinkedHashSet<String>();
    	annotations.add(HolleWorld.class.getCanonicalName());
    	return annotations
    }
    @SupportedAnnotationTypes("com.ldx.annotationlib.BindView")
    

    还可以使用注解来标明要处理的注解。该注解放在注解管理类的位置。

    @SupportedAnnotationTypes("com.xxx.xxx.HolleWorld")
    public class Myprocessor extands AbstractProcessor {
    	...
    }
    
  2. public SourceVersion getSupportedSourceVersion() 返回当前处理器支持的最新的代码版本。如果没有声明版本,则默认是SourceVersion.RELEASE_6, 一般返回SourceVersion.latestSupported()。

    @Override
    public SourceVersion getSupportedSourceVersion() {
        return SourceVersion.latestSupported();
    }

还可以使用注解来声明版本。该注解放在注解管理类的位置

@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class Myprocessor extands AbstractProcessor {
	...
}

相关属性和方法