代码手术刀—自定义你的代码重构工具
Tech
01 前言
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
02 实现思路
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
显而易见的是,能够使代码变得更加整洁,减少代码量,并且减少今后新增字段时带来的重复劳动。 可读性得到了提高,在其他同事参与开发时无需检查getter/setter里是否做了逻辑。 避免遗漏,减少犯错的风险,之前因为其他同事的接口数据漏写get方法,徒增了不少的沟通成本。
1.扫描整个工程代码,可以是多模块的工程。
2.读取其中的“.java”文件。
3.过滤其中不需要的类,例如interface,没有field的类(大概率是作为service出现),注解的声明等等。
4.删除getter/setter方法,这里需要判断在get和set方法里是否有特殊逻辑。
5.给类打上@Data注解,并且把lombok包引入进来。
private static List<File> scanJavaFiles(File file) {
List<File> result = Lists.newArrayList();
if (file.isDirectory()) {
File[] files = file.listFiles();
if (files == null) {
return result;
}
for (File f : files) {
result.addAll(scanJavaFiles(f));
}
}
if (file.getName().endsWith(".java")) {
result.add(file);
}
return result;
}
使用注解替换getter/setter
1.过滤掉无字段的类。
2.过滤掉已经使用lombok注解的类。
3.判断是否有显式getter/setter(这里需要注意,boolean类型的字段需要特殊处理)
4.判断getter/setter是否为简单的返回和赋值操作。
5.删除getter/setter。
6.添加@Data注解。
这里使用github上开源的工具javaParser来对类进行解析、代码提取、删除以及内容新增,javaParser会在下一章节进行介绍。
这里简单粗暴了一些,直接使用equals判断方法体,其实javaParser提供了更完善的api来分析语义。
在完成对代码的清理之后,需要将内容更新到java文件,CompilationUnit重写了toString方法,可以支持直接将代码转换成字符串的形式。
03 JavaParse介绍
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
JavaParser是什么?
JavaParser 是一个开源的 Java 源代码分析工具,它提供了一系列简单的API来解析、修改和生成 Java 代码。
1.分析代码中的类、方法、字段等元素,提取类的继承关系、方法的参数和返回类型等。
2.更改源码,例如重命名方法、修改方法体、添加或删除代码行等。
1.Lexer(词法分析器):词法分析器的作用是读取源代码文本,并将其分解成一系列的词法单元(tokens),如关键字、标识符、字面量、运算符等。这是解析过程的第一步。
包声明(Package Declaration)
导入声明(Imports)
类型声明(Type Declarations),这可能是类、接口、枚举或注解
注释(Comments)
任何顶级的注解
获取和设置包声明
获取和添加导入声明
获取和添加类型声明
获取和添加注释
使用访问者模式来遍历AST中的节点
上面的一些组件是javaParser中比较核心且常用的部分,当然javaParser还提供了一些便捷的工具类以及用法,这些内容笔者也没有接触过,有需要的读者可以自行翻阅文档。
04 工具使用方式
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
<dependency>
<groupId>com.jd.omni.opdd</groupId>
<artifactId>lombok-replace</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
添加maven插件
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<goals>
<goal>java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.jd.omni.opdd.tools.lombok.LombokConverter</mainClass>
<arguments>
<argument>../../pop-jingme-customs</argument>
</arguments>
</configuration>
</plugin>
执行 mvn exec:java
可以在控制台看到:
另外,对于没有引用lombok的模块,需要手动添加依赖。
05 写在最后
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
代码重构应该像手术刀一样,快、准、狠,正所谓君子生非异也,善假于物也。本文主要起一个抛砖引玉的作用,重点在于JavaParser的介绍,笔者写的这个小工具非常简单,之前也写过B-PaaS一键生成matrix.json,一键根据错误码定义生成i18n文件,大都不难。
京东流水线——满足你对工作流编排的一切幻想Java浅拷贝BeanUtils.copyProperties引发的RPC异常京东ES支持ZSTD压缩算法上线了:高性能,低成本
求分享
求点赞
求在看