最近在公司遇到了使用的类库lombok,好奇底层实现,探索得知是使用插入式注解实现的.
插入式注解是在代码编译时,通过特殊的插入式注解解释器,对语法树进行改造,使得根据注解添加实例域/方法成为可能.
以下为代码:
//简单的一个注解
/**
* @author doggy
* Created on 2016-07-21.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface An {
}
//继承AbstractProcessor的注解解释器
package com;
/**
* @author doggy
* Created on 2016-07-21.
*/
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class AnProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (Element e:roundEnv.getRootElements()){
System.out.println(e);
}
return false;
}
}
运行时使用
javac -processor AnProcessor Main.java即可改变对应类的结构.
如果需要把注解以及解释器打包成jar,那么不能显式的调用-processor,
可以在jar包的META-INF/services/下新建文件javax.annotation.processing.Processor
并写入所有的解释器的全限定类名,一个解释器一行.