美文网首页
APT高级用法JavaPoet

APT高级用法JavaPoet

作者: migill | 来源:发表于2019-12-25 18:21 被阅读0次

    1、什么是JavaPoet

    JavaPort是square公司推出的开源java代码生成框架,提供Java API生成.java源文件,这个框架功能非常实用,也是我们习惯的java面向对象OOP语法,可以很方便的使用它根据注解生成代码,通过这种自动化生成代码的方式,可以让我们用更加简洁优雅的方式替换繁琐冗杂的重复工作。
    项目主页及源码:https://github.com/square/javapoet

    2、开发环境配置

    3、JavaPoet8个常用的类

    4、JavaPoet字符串格式化规则

    4、JavaPoet的使用

    这里我们借助APT的介绍与使用中的例子,使用javapoet生成我们想要的文件。

    • \color{red}{在compiler模块中的build.gradle中添加javapoet的引用}
     // 帮助我们通过类调用的形式来生成Java代码
    implementation "com.squareup:javapoet:1.9.0"
    
    • \color{red}{新建一个注解处理器的类ARouterProcessorNew}
    @AutoService(Processor.class)
    @SupportedAnnotationTypes("com.migill.annotation.ARouter")
    @SupportedSourceVersion(SourceVersion.RELEASE_7)
    @SupportedOptions("content")
    public class ARouterProcessorNew extends AbstractProcessor {
        private Elements elementUtils;
        private Types typeUtils;
        private Messager messager;
        private Filer filer;
    
        @Override
        public synchronized void init(ProcessingEnvironment processingEnvironment) {
            super.init(processingEnvironment);
            elementUtils = processingEnvironment.getElementUtils();
            typeUtils = processingEnvironment.getTypeUtils();
            messager = processingEnvironment.getMessager();
            filer = processingEnvironment.getFiler();
            String content = processingEnvironment.getOptions().get("content");
            messager.printMessage(Diagnostic.Kind.NOTE, content);
        }
    
        @Override
        public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
            if (set.isEmpty()) return false;
            Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class);
            for (Element element : elements) {
                String packageName = elementUtils.getPackageOf(element).getQualifiedName().toString();
                String className = element.getSimpleName().toString();
                String finalClassName = className + "$ARouter";
                messager.printMessage(Diagnostic.Kind.NOTE, "生成的文件名:" + finalClassName);
                try {
                    // 高级写法,javapoet构建工具
                    ARouter aRouter = element.getAnnotation(ARouter.class);
                    //构造方法体
                    MethodSpec method = MethodSpec.methodBuilder("findTargetClass")//方法名
                            .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
                            .returns(Class.class)
                            .addParameter(String.class, "path")
                            .addStatement("return path.equals($S) ? $T.class : null", aRouter.path(), ClassName.get((TypeElement) element))
                            .build();
    
                    //构建类
                    TypeSpec typeSpec = TypeSpec.classBuilder(finalClassName)
                            .addModifiers(Modifier.PUBLIC)
                            .addMethod(method)//添加方法体
                            .build();
    
                    //在指定包名下,生成Java类文件
                    JavaFile javaFile = JavaFile.builder(packageName, typeSpec).build();
                    javaFile.writeTo(filer);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return false;
        }
    }
    

    现在编译,就可以生成对应的文件了,如下图,就是生成的文件与文件的内容

    相关文章

      网友评论

          本文标题:APT高级用法JavaPoet

          本文链接:https://www.haomeiwen.com/subject/mbncoctx.html