文章目录
一、Root 表作用
二、生成 Root 表
三、完整注解处理器代码 及 生成的 Java 代码 ( 仅供参考 )
1、注解处理器代码
2、app 模块中的注解类生成的 Java 源码
3、library2 模块中的注解类生成的 Java 源码
四、博客资源
组件化系列博客 :
【Android 组件化】从模块化到组件化
【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
【Android 组件化】使用 Gradle 实现组件化 ( 组件模式与集成模式切换 )
【Android 组件化】使用 Gradle 实现组件化 ( 组件 / 集成模式下的 Library Module 开发 )
【Android 组件化】路由组件 ( 路由组件结构 )
【Android 组件化】路由组件 ( 注解处理器获取被注解的节点 )
【Android 组件化】路由组件 ( 注解处理器中使用 JavaPoet 生成代码 )
【Android 组件化】路由组件 ( 注解处理器参数选项设置 )
【Android 组件化】路由组件 ( 构造路由表中的路由信息 )
【Android 组件化】路由组件 ( 使用 JavaPoet 生成路由表类 )
【Android 组件化】路由组件 ( 组件间共享的服务 )
一、Root 表作用
注解处理器 为每个 Module 模块生成一个路由表 , 该模块下凡是被 @Route 标注的路由节点都在该路由表中维护 ;
package kim.hsl.router; import java.lang.Override; import java.lang.String; import java.util.Map; import kim.hsl.library2.StringService; import kim.hsl.route_core.template.IRouteGroup; import kim.hsl.router_annotation.model.RouteBean; public class Router_Group_library2 implements IRouteGroup { @Override public void loadInto(Map<String, RouteBean> atlas) { atlas.put("library2", new RouteBean(RouteBean.Type.ISERVICE, StringService.class, "/library2/StringService", "library2")); } }
模块名称是 app , 则路由表的名称是 Router_Group_app.java ;
一个模块中的路由表可能有多个 , 需要为若干路由表再生成一个 Root 表, 用于作为路由表的导航 ;
生成的 Root 表样式 : 其中 “app” 是组名 , Router_Group_app.class 是 app 组对应的路由表类 ;
package kim.hsl.router; import java.lang.Class; import java.lang.Override; import java.lang.String; import java.util.Map; import kim.hsl.route_core.template.IRouteGroup; import kim.hsl.route_core.template.IRouteRoot; public class Router_Root_app implements IRouteRoot { @Override public void loadInto(Map<String, Class<? extends IRouteGroup>> routes) { routes.put("app", Router_Group_app.class); } }
二、生成 Root 表
定义 IRouteRoot 接口 , 所有的 Root 类都实现该接口 , 该接口定义在 route-core 模块中 ;
package kim.hsl.route_core.template; import java.util.Map; public interface IRouteRoot { void loadInto(Map<String, Class<? extends IRouteGroup>> routes); }
IRoot 接口定义位置 :
首先 , 获取 IRouteGroup 和 IRouteRoot 接口的节点 ;
// 获取 kim.hsl.route_core.template.IRouteGroup 类节点 TypeElement iRouteGroup = mElementUtils.getTypeElement("kim.hsl.route_core.template.IRouteGroup"); // 获取 kim.hsl.route_core.template.IRouteRoot 类节点 TypeElement iRouteRoot = mElementUtils.getTypeElement("kim.hsl.route_core.template.IRouteRoot");
其次 , 生成 loadInto 函数的参数 Map<String, Class<? extends IRouteGroup>> routes ;
// 生成参数类型名称 // Map<String,Class<? extends IRouteGroup>> routes> ParameterizedTypeName routesTypeName = ParameterizedTypeName.get( ClassName.get(Map.class), ClassName.get(String.class), ParameterizedTypeName.get( ClassName.get(Class.class), WildcardTypeName.subtypeOf(ClassName.get(iRouteGroup)) ) ); // 生成参数 // Map<String,Class<? extends IRouteGroup>> routes> routes ParameterSpec rootParameterSpec = ParameterSpec.builder(routesTypeName, "routes") .build();
再次 , 生成函数及函数体 ;
// 生成函数 // public void loadInfo(Map<String,Class<? extends IRouteGroup>> routes> routes) MethodSpec.Builder loadIntoMethodBuilder = MethodSpec.methodBuilder("loadInto") .addAnnotation(Override.class) .addModifiers(Modifier.PUBLIC) .addParameter(rootParameterSpec); // 生成函数体 for (Map.Entry<String, String> entry : mRootMap.entrySet()) { loadIntoMethodBuilder.addStatement( "routes.put($S, $T.class)", entry.getKey(), ClassName.get("kim.hsl.router", entry.getValue()) ); }
最后 , 生成 Router_Root_app 类 , 并写出到文件中 ;
// 生成 Root 类 String rootClassName = "Router_Root_" + mModuleName; // 创建 Java 类 TypeSpec typeSpec = TypeSpec.classBuilder(rootClassName) .addSuperinterface(ClassName.get(iRouteRoot)) .addModifiers(PUBLIC) .addMethod(loadIntoMethodBuilder.build()) .build(); // 生成 Java 源文件 JavaFile javaFile = JavaFile.builder("kim.hsl.router", typeSpec).build(); // 写出到文件中 try { javaFile.writeTo(mFiler); } catch (IOException e) { e.printStackTrace(); }