APT in Android
【参考链接】
注解入门:反射+APT http://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
@interface
HelloAnno
{
String value()
default
"var";
}
2. 编写注解处理器
再新建一个Java Library类型的module,名为anno_processor_lib
2.1.
由于要解析注解,所以需要在module的build.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 class
HelloProcessor
extends
AbstractProcessor {
@Override
public boolean
process(Set<?
extends
TypeElement>annotations,
RoundEnvironment roundEnv) {
//获取所有使用了HelloAnno注解的类
for
(Element element : roundEnv.getElementsAnnotatedWith(HelloAnno.class))
{
String name = element.getSimpleName().toString();
HelloAnno
annotation = element.getAnnotation(HelloAnno.class);
StringBuilder builder =
new
StringBuilder()
.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.
然后还需要在这个module的src\main目录下创建一个resources\META-INF\services目录,并在其中创建一javax.annotation.processing.Processor文件,在其中添加一行内容为刚创建的注解处理器类
3. 使用注解
在主module app中
3.1.
由于要使用注解,所以要添加对anno_lib的依赖,在app module的build.gradle中
compile project (':anno_lib')
3.2.
还需要指定注解处理器,这需要借助于gradle android-apt插件
在工程的根build.gradle中
l 指定插件的classpath
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
在app module的build的gradle中
l 应用插件
apply plugin: 'com.neenbedankt.android-apt'
l 指定注解处理器,在dependencies中
apt project(':anno_processor_lib')
3.3.
然后就可以在app中编写一个测试类使用HelloAnno注解
@HelloAnno
public class
Test {
}
执行Build->Make Project,完成以后,在app module的build\generated\source\apt\debug\目录下会生成源代码com\shadowfaxghh\generated\GeneratedTest.java
然后我们就可以在自己的代码中调用生成的类了