Android使用Java编译时注解处理器(Annotation Processor)详解

一,只使用Java注解处理器

Android使用Java编译时注解处理器(Annotation Processor)详解_第1张图片
demo请看 github

javalib 定义annotation
javalib 定义processor
app

说明:(lib_annotation和lib_processor可以写到一个lib里)

  1. javalib annotation:定义注解。

  2. javalib processor:处理注解。
    2.1. 引入javalib annotation;
    2.2. 指明注解类:在main文件夹中新建resources文件 -> META-INF -> services -> javax.annotation.processing.Processor -> 内容com.goals.lib_processor.MyProcessor(可不用写分号结束)

    2.3. 写注解处理类,继承AbstractProcessor类

    @SupportedSourceVersion(SourceVersion.RELEASE_8)
    //指定注解处理类
    @SupportedAnnotationTypes("com.goals.lib_annotation.MyAnnotation")
    public class MyProcessor extends AbstractProcessor {
    
    	@Override
        public boolean process(Set<? extends TypeElement> set,
                               RoundEnvironment roundEnvironment) {
            processingEnv.getMessager().printMessage(
                    Diagnostic.Kind.NOTE,
                    "----------my_processor processing-----------"
            );
    
    		//找到所有使用了注解的类的集合
            for (Element element:
                    roundEnvironment.getElementsAnnotatedWith(MyAnnotation.class)){
    
                processingEnv.getMessager().printMessage(
                        Diagnostic.Kind.NOTE,
                        "---------------------"
                );
    
                //判断元素的类型为class
                if (element.getKind() == ElementKind.CLASS){
                    //显示转换元素类型
                    TypeElement typeElement = (TypeElement) element;
                    //输出元素名称
                    processingEnv.getMessager().printMessage(
                            Diagnostic.Kind.NOTE,
                            typeElement.getSimpleName()
                    );
                    //输出元素需要打印的值
                    processingEnv.getMessager().printMessage(
                            Diagnostic.Kind.NOTE,
                            typeElement.getAnnotation(MyAnnotation.class).value()
                    );
                }
    
                processingEnv.getMessager().printMessage(
                        Diagnostic.Kind.NOTE,
                        "-----------------------"
                );
            }
    
            return false;
        }
    	
    
    	/**
         * 要重写这个方法,再次指定注解处理的类是哪个
         * @return
         */
        @Override
        public Set<String> getSupportedAnnotationTypes() {
    
            Set<String> annotations = new LinkedHashSet<>();
            annotations.add(MyAnnotation.class.getCanonicalName());
    
    //        return super.getSupportedAnnotationTypes();
            return annotations;
        }
    
    
  3. app:使用注解
    3.1 使用:

    
    	@MyAnnotation("hello world")
    	public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
       		}
    	}
    
    

    3.2 引入:

    
    implementation project(path: ':lib_annotation');
    //如果只使用annotationProcessor,会产生只有第一次编译才生效,后边就不生效的问题。
    //如果加上implementation,每次编译都能打印出注解传递的值
    implementation project(path: ':lib_processor');
    annotationProcessor project(path: ':lib_processor');
    
    

二,使用google auto-services处理注解

项目结构一样,依赖关系也是一样的
demo请看 github

javalib 定义annotation
javalib 定义processor
app

说明:

  1. lib_annotation:还是原来一样的,只是加入了google auto-services最好使用JavaVersion.VERSION_1_8避免兼容性问题。
  2. app也是一样:lib_processor的引入需要使用两个,implementation和annotationProcessor
    implementation project(path: ':lib_annotation')
    
    annotationProcessor project(path: ':lib_processor')
    implementation project(path: ':lib_processor')
    
  3. lib_processor:
    3.1. 引入javalib annotation;
    3.2. 引入google auto-services
    implementation project(path: ':lib_annotation');
    //同样需要两个auto-service引入,一个implementation,一个annotationProcessor
    // https://mvnrepository.com/artifact/com.google.auto.service/auto-service
    implementation 'com.google.auto.service:auto-service:1.0.1'
    annotationProcessor 'com.google.auto.service:auto-service:1.0.1'
    
    3.2. 与使用Java注解处理器不同,这里不需要指明注解类!!!:不用在main文件夹中新建resources文件 -> META-INF -> services -> javax.annotation.processing.Processor -> 内容。com.goals.lib_processor.MyProcessor(可不用写分号结束)。这个内容会由google auto-service自动在编译时给你自动生成。
    3.3. 写注解处理类,继承AbstractProcessor类
    
    import javax.annotation.processing.Processor;
    
    @SupportedSourceVersion(SourceVersion.RELEASE_8)
    //指定注解处理类
    //java 注解处理写法
    //@SupportedAnnotationTypes("com.goals.lib_annotation.MyAnnotation")
    //google auto-services处理注解写法
    @AutoService(Processor.class)
    public class MyProcessor extends AbstractProcessor {
    
    	@Override
        public boolean process(Set<? extends TypeElement> set,
                               RoundEnvironment roundEnvironment) {
            //同上
        }
    	
    
    	/**
    	 * 这个方法一定要重写,不然注解处理不会生效
         * 要重写这个方法,再次指定注解处理的类是哪个
         * @return
         */
        @Override
        public Set<String> getSupportedAnnotationTypes() {
    
            Set<String> annotations = new LinkedHashSet<>();
            annotations.add(MyAnnotation.class.getCanonicalName());
    
    //        return super.getSupportedAnnotationTypes();
            return annotations;
        }
    
    

你可能感兴趣的:(Java,Android,android,java,开发语言)