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<? extends TypeElement> annoations, RoundEnvironment env) { }
@Override
public Set<String> getSupportedAnnotationTypes() { }
@Override
public SourceVersion getSupportedSourceVersion() { }
}
- init(ProcessingEnvironment env): 每个annotation processor class必须有一个空构造函数。init()方法被注解处理器调用,ProcessingEnvironment 参数提供了一些很有用的工具类,比如Elements、Types和Filer,稍后会用到。
- process(Set<? extends TypeElement> 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<? extends TypeElement> 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来使用即可
网友评论