annotation process tool

背景

关于APT(Annotation Processing Tool 简称,即注解处理器)的讲解资料很少
初衷:看JMH的时候发现莫名的在compile期间,根据注解生成了一些文件,发现是APT在编译期间干的
作用:用于在编译时期处理某些特定的注解
实例:java velocity模块,dagger,butterKnife应该都用了这个功能要去看看源码才知道

关于注解:看这个好了http://www.cnblogs.com/peida/archive/2013/04/23/3036035.html
图要用一下:

annotation process tool_第1张图片
Paste_Image.png

demo

实现的功能就是processor在编译期间把所有带有注解的方法给打出来
结构如下


annotation process tool_第2张图片
Paste_Image.png

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 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
annotation process tool_第3张图片
Paste_Image.png
4.2修改依赖(或者把AnnotationAndProcessor的module打jar包引入lib都行)
annotation process tool_第4张图片
Paste_Image.png

5效果

build时候message就会出现Processor中的效果

annotation process tool_第5张图片
Paste_Image.png

参考

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

你可能感兴趣的:(annotation process tool)