函数创建部分代码 :
// 创建函数 loadInto MethodSpec.Builder methodBuilder = MethodSpec.methodBuilder("loadInto") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override.class) .addParameter(atlasValue); // 函数体中的代码生成 // 获取 ArrayList<RouteBean> 数据 ArrayList<RouteBean> groupRoutes = entry.getValue(); // 组名 String groupName = ""; // 生成函数体代码 for (RouteBean routeBean : groupRoutes){ // 获取组名 groupName = routeBean.getRouteGroup(); // $S 表示字符串 // $T 表示类 // $L 表示字面量 , 原封不动的字符串替换 methodBuilder.addStatement("atlas.put($S, new $T($T.$L, $T.class, $S, $S))", // $S 字符串 : "main" routeBean.getRouteGroup(), // $T 类名 : RouteBean ClassName.get(RouteBean.class), // $T 类名 : Type ClassName.get(RouteBean.Type.class), // $L 字面量 : ACTIVITY routeBean.getType(), // $T 类名 : kim.hsl.component.MainActivity 类 ClassName.get((TypeElement) routeBean.getElement()), // $S 字符串 : "/app/MainActivity" routeBean.getRouteAddress(), // $S 字符串 : "app" routeBean.getRouteGroup()); }
5、Java 类创建
调用 TypeSpec.classBuilder 方法 , 创建 Java 类 , 传入类名作为参数 ,
addSuperinterface 方法用于设置实现的接口 ,
addModifiers 方法设置类的其它参数 , 如可见性 , 静态 ;
addMethod 方法设置类的方法 ;
最后调用 build 方法生成类 ;
// 创建类 // 构造类名 Router_Group_main String groupClassName = "Router_Group_" + groupName; // 创建类 TypeSpec typeSpec = TypeSpec.classBuilder(groupClassName) .addSuperinterface(ClassName.get(iRouteGroup)) .addModifiers(PUBLIC) .addMethod(methodBuilder.build()) .build(); // 生成 Java 源码文件 JavaFile javaFile = JavaFile.builder("kim.hsl.router", typeSpec).build();
6、写出 Java 源码到文件中
将上述生成的 Java 源码写出到文件中 ;
// 将 Java 源文件写出到相应目录中 try { javaFile.writeTo(mFiler); } catch (IOException e) { e.printStackTrace(); } // 统计路由表信息 mRootMap.put(groupName, groupClassName);
三、完整注解处理器及运行结果
1、完整注解处理器代码
生成的 Java 源代码 : 生成的源码路径 " D:\002_Project\002_Android_Learn\Component\app\build\generated\ap_generated_sources\debug\out\kim\hsl\router\Router_Group_app.java "
package kim.hsl.router; import java.lang.Override; import java.lang.String; import java.util.Map; import kim.hsl.component.MainActivity; import kim.hsl.route_core.template.IRouteGroup; import kim.hsl.router_annotation.model.RouteBean; public class Router_Group_app implements IRouteGroup { @Override public void loadInto(Map<String, RouteBean> atlas) { atlas.put("app", new RouteBean(RouteBean.Type.ACTIVITY, MainActivity.class, "/app/MainActivity", "app")); } }
2、执行结果
编译过程打印结果 :
注: Messager Print Log 注: 打印 moduleName 参数 : app 注: 打印类节点 typeElement : android.app.Activity 注: 打印路由地址 /app/MainActivity 的组名为 app 注: 打印路由信息 : RouteBean{type=ACTIVITY, element=kim.hsl.component.MainActivity, clazz=null, routeAddress='/app/MainActivity', routeGroup='app'} 注: 打印类节点 iRouteGroup : kim.hsl.route_core.template.IRouteGroup
四、博客资源
博客源码 :
GitHub : https://github.com/han1202012/Component
CSDN 下载 :
