Android架构师-组件化-组件化APT高级用法JavaPoet 5

一:什么是JavaPoet

1:定义

Android架构师-组件化-组件化APT高级用法JavaPoet 5_第1张图片

项目主页及源码:https://github.com/square/javapoet

对我们前一章的内容做了一个封装,实现过程稍微有点不一样,

传统的写法:从包名--》类---》属性--》方法  正序

JavaPoet:方法--》属性---》类---》包      倒序

2:依赖JavaPoet库

Android架构师-组件化-组件化APT高级用法JavaPoet 5_第2张图片

使用JavaPoet有Retrofit和Butternife

3:JavaPoet常用的API

Android架构师-组件化-组件化APT高级用法JavaPoet 5_第3张图片

4:JavaPoet字符串格式化规则:跟StringFormat差不多

Android架构师-组件化-组件化APT高级用法JavaPoet 5_第4张图片

5:先简单了解下JavaPoet中的字符串格式化是什么意思

这个是java的格式化

Android架构师-组件化-组件化APT高级用法JavaPoet 5_第5张图片

我们还是重复上一章的内容,创建注解和注解处理器。

其中注解处理器中的process


    /**
     * 相当于main函数,开始处理注解
     * 注解处理器的核心方法,处理具体的注解,生成Java文件
     *
     * @param set              使用了支持处理注解的节点集合
     * @param roundEnvironment 当前或是之前的运行环境,可以通过该对象查找找到的注解。
     * @return true 表示后续处理器不会再处理(已经处理完成)
     */
    @Override
    public boolean process(Set set, RoundEnvironment roundEnvironment) {
        if (set.isEmpty()) return false;

        // 获取所有带ARouter注解的 类节点
        Set 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;
    }

 

你可能感兴趣的:(Android架构师-组件化-组件化APT高级用法JavaPoet 5)