Annotations 1

Annotations Processing

概念

Annotation processing-javac在编译时扫描、处理Annotation的工具。对于特定的注解可以注册对应的annotation processor。

特定注解的注解处理器以java code作为输入.java文件作为输出。可以理解成在编译时生成想要的.java文件,生成的.java文件和其他手写的.java文件一样会被javac编译。

NOTE:仅仅是生成,注解处理器并不能修改已经存在的对象,比如增加一个方法

AbstractProcessor

自定义Processor需要继承java内置的AbstractProcessor,比较重要的几个方法如下

package com.wsl;
public class MyProcessor extends AbstractProcessor {
    @Override
    public synchronized void init(ProcessingEnvironment env){ }
    @Override
    public boolean process(Set annoations, RoundEnvironment env) { }
    @Override
    public Set getSupportedAnnotationTypes() { }
    @Override
    public SourceVersion getSupportedSourceVersion() { }
}
  • init(ProcessingEnvironment env): 每个annotation processor class必须有一个空构造函数。init()方法被注解处理器调用,ProcessingEnvironment 参数提供了一些很有用的工具类,比如Elements、Types和Filer,稍后会用到。
  • process(Set annotations, RoundEnvironment env):每个注解处理器最主要的方法,生成java文件的逻辑就是在这里完成的。RoundEnvironment 参数可以查询被注解过的元素。
  • getSupportedAnnotationTypes(): 注解处理器注册对应的Annotations
  • getSupportedSourceVersion(): 指定java version,一般情况下 return SourceVersion.latestSupported()即可,或者也可以return其他版本,比如SourceVersion.RELEASE_6.

如果java7以上版本可以用@SupportedSourceVersion、@SupportedAnnotationTypes代替getSupportedAnnotationTypes() 和 getSupportedSourceVersion()

@SupportedSourceVersion(SourceVersion.latestSupported())
@SupportedAnnotationTypes({
   // Set of full qullified annotation type names
 })
public class MyProcessor extends AbstractProcessor {
    @Override
    public synchronized void init(ProcessingEnvironment env){ }
    @Override
    public boolean process(Set annoations, RoundEnvironment env) { }
}

NOTE: 考虑到编译的兼容性问题(特别是Android),推荐重载getSupportedAnnotationTypes() 和 getSupportedSourceVersion()

Annotation Processor运行在自己的jvm里,javac会开启一个jvm来运行注解处理器,这就意味着可以添加一些第三方依赖库,比如guava

Register Processor

需要提供一个jar,jar包括MyProcessor和javax.annotation.processing.Processor,如下:

MyProcessor.jar
- com
- example
- MyProcessor.class
- META-INF
- services
- javax.annotation.processing.Processor

javax.annotation.processing.Processor的作用是告诉javac用到了哪些Processor,如下

com.example.MyProcessor
com.foo.OtherProcessor
net.blabla.SpecialProcessor

可把MyProcessor.jar当作第三方Library来使用即可

你可能感兴趣的:(Annotations 1)