APT in Android

来源:互联网 发布:tomcat 域名绑定 端口 编辑:程序博客网 时间:2024/05/29 17:40

【参考链接】

注解入门:反射+APThttp://www.jianshu.com/p/dce26aa75060

实现一个简单的Java编译时注解处理器https://yq.aliyun.com/articles/59493

 

前面讲了在Java中使用APT,那么在Android中如何操作呢?

Android Studio为例,先新建一个工程

1.    编写注解

在工程中新建一个Java Library类型的module,名为anno_lib,在其中创建一个注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.CLASS)
public@interfaceHelloAnno{
    String
value()default"var";
}

 

2.    编写注解处理器

再新建一个Java Library类型的module,名为anno_processor_lib

2.1.    

由于要解析注解,所以需要在modulebuild.gradle中添加对anno_lib的依赖

dependencies {
    compile fileTree(
dir:'libs',include: ['*.jar'])

    compile project(
':anno_lib');
}

2.2.    

然后编写注解处理器类HelloProcessor,示例的处理逻辑是获取所有使用了HelloAnno注解的类,创建一个Generated+原类名的新类,并在其中创建一个public String sayHello()方法

@SupportedAnnotationTypes("com.shadowfaxghh.anno.HelloAnno")//指定处理的注解
@SupportedSourceVersion(SourceVersion.RELEASE_7)
public classHelloProcessorextendsAbstractProcessor {
   
@Override
   
public booleanprocess(Set<?extendsTypeElement>annotations,RoundEnvironment roundEnv) {

       
//获取所有使用了HelloAnno注解的类
       
for(Element element : roundEnv.getElementsAnnotatedWith(HelloAnno.class)) {
           String name = element.getSimpleName().toString()
;
           
HelloAnnoannotation = element.getAnnotation(HelloAnno.class);

           
StringBuilder builder =newStringBuilder()
                   .append(
"package com.shadowfaxghh.generated;\n\n")
                   .append(
"public class Generated"+name+"{\n\n")// open class
                   
.append("\tpublic String sayHello() {\n")// open method
                   
.append("\t\treturn ")
                   .append(
"\""+annotation.value()+"\";")
                   .append(
"\n")
                   .append(
"\t}\n")// close method
                   
.append("}\n");// close class

           
try{
               JavaFileObject source =
processingEnv.getFiler().createSourceFile("com.shadowfaxghh.generated.Generated"+name);
               
Writer writer = source.openWriter();
               
writer.write(builder.toString());
               
writer.flush();
               
writer.close();
           
}catch(IOException e) {
           }
       }

       
return true;
   
}
}

2.3.    

然后还需要在这个modulesrc\main目录下创建一个resources\META-INF\services目录,并在其中创建一javax.annotation.processing.Processor文件,在其中添加一行内容为刚创建的注解处理器类


 

3.    使用注解

在主module app

3.1.    

由于要使用注解,所以要添加对anno_lib的依赖,在app modulebuild.gradle

compile project (':anno_lib')

 

3.2.    

还需要指定注解处理器,这需要借助于gradle android-apt插件

在工程的根build.gradle

l 指定插件的classpath

classpath'com.neenbedankt.gradle.plugins:android-apt:1.8'

 

app modulebuildgradle

l 应用插件

applyplugin:'com.neenbedankt.android-apt'

l 指定注解处理器,在dependencies

apt project(':anno_processor_lib')

 

3.3.    

然后就可以在app中编写一个测试类使用HelloAnno注解

@HelloAnno
public classTest {
}

 

执行Build->Make Project,完成以后,在app modulebuild\generated\source\apt\debug\目录下会生成源代码com\shadowfaxghh\generated\GeneratedTest.java


 

然后我们就可以在自己的代码中调用生成的类了