前言
这几年随着技术的不断更新,移动端的开发更趋于夸平台模式。但是单平台开发还是依然的火热,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());
}
}