目的很简单,就是利用APT生成一个HelloWorld的类。
第一步
在工程项目中新增一个Java Library Model 名称为 ApiFinderAnnotation-compiler 并创建一个Class extend AbstractProcessor 先暂时不改这个类
在工程项目中新增一个Java Library Model 名称为ApiFinderAnnotation-annotation 这个Model会给相关项目提供annotation 创建两个annotation class ,APIManager class
and APIService class
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface APIManager {
}
@Retention(RetentionPolicy.CLASS)
@Target(ElementType.TYPE)
public @interface APIService {
}
在compiler项目下打开build.gradle文件并添加
compile 'com.squareup:javapoet:1.7.0' //java文件生成
compile 'com.google.auto.service:auto-service:1.0-rc2'//自动生成Processer配置
compile project(':gearapifinder-annotation')
第二步
打开APIFinderProcesser class 添加
@AutoService(Processor.class) //自动生成Processor配置
@AutoService(Processor.class)
public class APIFinderProcesser extends AbstractProcessor {
private Filer mFiler;//文件相关
private Elements mElementUtils;//元素相关
private Messager mMessager;//日志相关
@Override
public synchronized void init(ProcessingEnvironment processingEnv) {
super.init(processingEnv);
mFiler=processingEnv.getFiler();
mElementUtils=processingEnv.getElementUtils();
mMessager=processingEnv.getMessager();
}
/**
* 指定哪些注解应该被注解处理器注册
* @return
*/
@Override
public Set<String> getSupportedAnnotationTypes() {
Set<String> types=new LinkedHashSet<>();
types.add(APIManager.class.getCanonicalName());
types.add(APIService.class.getCanonicalName());
return types;
}
/**
* 指定使用java版本
* @return
*/
@Override
public SourceVersion getSupportedSourceVersion() {
return SourceVersion.latestSupported();
}
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
//构建方法
MethodSpec main = MethodSpec.methodBuilder("main")//方法名
.addModifiers(Modifier.PUBLIC,Modifier.STATIC)
.returns(TypeName.VOID)
.addParameter(String[].class,"arg")
.addStatement("$T.out.println($S)",System.class,"Hello world")
.build();
//构建类
TypeSpec helloWorld = TypeSpec.classBuilder("HelloWorld")//类名
.addModifiers(Modifier.PUBLIC,Modifier.FINAL)
.addMethod(main)//添加方法
.build();
//构建java文件
JavaFile javaFile =JavaFile
.builder("gear.yc.com.gearapplication.base",helloWorld)//指定java的生成目录
.build();
try {
javaFile.writeTo(mFiler);
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
}
第三步
打开主目录下build.gradle文件 增加
apt project(':gearapifinder-compiler')
compile project(':gearapifinder-annotation')
如果之前从来没有添加过apt那么还需要添加
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //这里
}
}
apply plugin: 'com.neenbedankt.android-apt' //还有这里
第四步
Mark Project
如果顺利的话可以在下面的目录下找到生成的java文件
如果没有可以再Rebuild Project
可能出现的错误
如果build时提示java版本错误,可能是你的java modle 使用了过高的版本,在java model build.gradle 文件中我使用的是下面的配置。
sourceCompatibility = "1.7"
targetCompatibility = "1.7"
如果无法生成HelloWorld类那么请查看以下目录下是否生成了相关配置文件
基本上生成一个测试类的步骤就是这样了,这里其实并没有用到annotation相关的东西,annotation会在后面的章节使用到。
章节目录
第一章 APT之生成Retrofit+Rxjava管理类
第二章 APT之HelloWorld Class
第三章 APT之生成接口管理类
相关连接
Android 利用 APT 技术在编译期生成代码
javapoet
Annotation-Processing-Tool 详解