组件化开发和JavaPoet倒序生成方法、类、包代码


前言

这几年随着技术的不断更新,移动端的开发更趋于夸平台模式。但是单平台开发还是依然的火热,android 方面组件化、插件化、热修复等开发模式,在不同的应用场景上,依然还是受到广大开发者的热爱和追捧。由于本人对组件化开发相对熟悉一点,就简单的介绍一下,组件化的开发。

组件化使用与分析

组件化开发,一般比较适用于多人团队的开发,如果是一个人话,那这个项目开发有可能会有种过度设计的感觉,但是现在依靠文件夹来分包,在项目业务功能越来越大的时候,慢慢的整个项目就回变的越来越冗余,也会对后期项目的维护带来极大的困难。组件化开发的模式,我觉得有以下特点,不相互依赖、高度解耦、任意组合、分层独立化,在有重复使用的模块的时候,可以重复的使用。

分层独立化

如下图,整个组件化开发,智能纵向依赖,不能横向依赖
图例

APT使用的重要元素

组件化开发避不开使用APT(根据我们自己定的规则,帮我们生成代码及生成我们自己需要的类)技术。其中我们也会使用到javapoet,android之神写的。比之前传统的生成代码不同,加入了OOP模式。

终于元素说明
PackageElement表示程序包元素,提供对有关包及其他成员的信息访问
ExecutabElement表示某个类或者接口的方法、构造方法或初始化程序(静态或实例)
TypeElement表示一个类或者接口程序元素提供对有关类型及成员的信息的访问
VariabElement表示一个字段、enum常量方法或构造方法参数局部变量或者异常参数

自动生成的模板1

public final class HuangXianFengTest {
  public static void main(System[] args) {
    System.out.println("Hello JavaPoet!");
  }
}

第一种方法

Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class);
        for (Element element : elements) {
            //生成方法
            MethodSpec mainMethod = MethodSpec.methodBuilder("main")
                    .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
                    .returns(void.class)
                    .addParameter(String[].class,"args")
                    .addStatement("$T.out.println($S)",System.class,"Hello JavaPoet!")
                    .build();

            //生成类
            TypeSpec testClass = TypeSpec.classBuilder("HuangXianFengTest")
                    .addMethod(mainMethod)
                    .addModifiers(Modifier.PUBLIC,Modifier.FINAL)
                    .build();

            //生成包
            JavaFile packagef = JavaFile.builder("com.muf.arouter.test",testClass).build();

            try {
                packagef.writeTo(filer);
            } catch (IOException e) {
                e.printStackTrace();
                messager.printMessage(Diagnostic.Kind.NOTE,"生成Test文件时失败,异常:"+e.getMessage());
            }

第二种方法

if (set.isEmpty()){
            return false;
        }
        Set<? extends Element> elements = roundEnvironment.getElementsAnnotatedWith(ARouter.class);

        for (Element element : elements) {
            //包信息
            String packageName = elementTool.getPackageOf(element).getQualifiedName().toString();
            String className = element.getSimpleName().toString();
            messager.printMessage(Diagnostic.Kind.NOTE,"被@ARouter注解的类有:"+className);
            String finalClassName = className + "$$$$$$$ARouter";
            ARouter aRouter = element.getAnnotation(ARouter.class);
            //生成方法
            MethodSpec finalTargetClass = 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 myClass = TypeSpec.classBuilder(finalClassName)
                    .addMethod(finalTargetClass)
                    .addModifiers(Modifier.PUBLIC)
                    .build();

            //生成包
            JavaFile packagef = JavaFile.builder(packageName,myClass).build();

            try {
                packagef.writeTo(filer);
            } catch (IOException e) {
                e.printStackTrace();
                messager.printMessage(Diagnostic.Kind.NOTE,"生成"+finalClassName+"文件时失败.异常:"+e.getMessage());
            }
     }

开发者联盟

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DT从零到壹

您的鼓励是我创作最大的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值