背景
关于APT(Annotation Processing Tool 简称,即注解处理器)的讲解资料很少
初衷:看JMH的时候发现莫名的在compile期间,根据注解生成了一些文件,发现是APT在编译期间干的
作用:用于在编译时期处理某些特定的注解
实例:java velocity模块,dagger,butterKnife应该都用了这个功能要去看看源码才知道
关于注解:看这个好了http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
图要用一下:
demo
实现的功能就是processor在编译期间把所有带有注解的方法给打出来
结构如下
1.META-INF/services文件下写明processor的路径,为
src.processor.MyProcessor
2.MyAnnotation随便写一个注解好了
package src.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
3.Processor打出所有包含注解的方法名称
package src.processor;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Messager;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.Element;
import javax.lang.model.element.TypeElement;
import javax.tools.Diagnostic;
import java.util.Set;
@SupportedAnnotationTypes("*")
public class MyProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
Messager messager = processingEnv.getMessager();
for (TypeElement te : annotations) {
for (Element e : roundEnv.getElementsAnnotatedWith(te)) {
messager.printMessage(Diagnostic.Kind.NOTE, "Printing: " + e.toString());
}
}
messager.printMessage(Diagnostic.Kind.NOTE, "----------process-------------");
return true;
}
}
4.另一module引用该注解以及processor
import src.annotation.MyAnnotation;
public class Main {
@MyAnnotation
public static void test() {
System.out.println("test");
}
public static void main(String[] args) {
test();
}
}
4.1修改settings,要求支持annotation processor
4.2修改依赖(或者把AnnotationAndProcessor的module打jar包引入lib都行)
5效果
build时候message就会出现Processor中的效果
参考
http://qiushao.net/2015/07/07/Annotation-Processing-Tool%E8%AF%A6%E8%A7%A3/
文档介绍
https://www.javacodegeeks.com/2015/01/how-to-process-java-annotations.html
http://qiushao.net/2015/07/07/Annotation-Processing-Tool%E8%AF%A6%E8%A7%A3/
demo教程
http://hintdesk.com/android-introduction-to-androidannotations-maven-in-intellij-idea/
http://www.cnblogs.com/avenwu/p/4173899.html
错误处理
http://blog.csdn.net/u010405231/article/details/52210408