一:什么是JavaPoet
1:定义
项目主页及源码:https://github.com/square/javapoet
对我们前一章的内容做了一个封装,实现过程稍微有点不一样,
传统的写法:从包名--》类---》属性--》方法 正序
JavaPoet:方法--》属性---》类---》包 倒序
2:依赖JavaPoet库
使用JavaPoet有Retrofit和Butternife
3:JavaPoet常用的API
4:JavaPoet字符串格式化规则:跟StringFormat差不多
5:先简单了解下JavaPoet中的字符串格式化是什么意思
这个是java的格式化
我们还是重复上一章的内容,创建注解和注解处理器。
其中注解处理器中的process
/**
* 相当于main函数,开始处理注解
* 注解处理器的核心方法,处理具体的注解,生成Java文件
*
* @param set 使用了支持处理注解的节点集合
* @param roundEnvironment 当前或是之前的运行环境,可以通过该对象查找找到的注解。
* @return true 表示后续处理器不会再处理(已经处理完成)
*/
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
if (set.isEmpty()) return false;
// 获取所有带ARouter注解的 类节点
Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class);
// 遍历所有类节点
for (Element element : elements) {
// 通过类节点获取包节点(全路径:com.netease.xxx)
String packageName = elementUtils.getPackageOf(element).getQualifiedName().toString();
// 获取简单类名
String className = element.getSimpleName().toString();
messager.printMessage(Diagnostic.Kind.NOTE, "被注解的类有:" + className);
// 最终想生成的类文件名
String finalClassName = className + "$$ARouter";
// 高级写法,javapoet构建工具,参考(https://github.com/JakeWharton/butterknife)
try {
// 获取类之上@ARouter注解的path值
ARouter aRouter = element.getAnnotation(ARouter.class);
// 构建方法体
MethodSpec method = MethodSpec.methodBuilder("findTargetClass") // 方法名
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(Class.class) // 返回值Class<?>
.addParameter(String.class, "path") // 参数(String path)
// 方法内容拼接:
// return path.equals("/app/MainActivity") ? MainActivity.class : null
.addStatement("return path.equals($S) ? $T.class : null",
aRouter.path(), ClassName.get((TypeElement) element))
.build(); // 构建
// 构建类
TypeSpec type = TypeSpec.classBuilder(finalClassName)
.addModifiers(Modifier.PUBLIC) //, Modifier.FINAL)
.addMethod(method) // 添加方法体
.build(); // 构建
// 在指定的包名下,生成Java类文件
JavaFile javaFile = JavaFile.builder(packageName, type)
.build();
javaFile.writeTo(filer);
} catch (IOException e) {
e.printStackTrace();
}
}
return true;
}