Tech
01
前言
在今年的敏捷团队建设中,我通过Suite执行器实现了一键自动化单元测试。Juint除了Suite执行器还有哪些执行器呢?由此我的Runner探索之旅开始了!
笔者近日在做代码仓库的存量代码缩减工作,首先考虑的是基于静态扫描的缩减,尝试使用了很多工具来对代码进行优化,例如PMD、IDEA自带的inspect功能、findBugs等。但是无一例外,要么过于“保守”,只给出扫描结果,但是无法实现一键优化,要么直接就是有bug(这里特指IDEA2023.1.5专业版-inspect功能扫描problems清单里的unused declaration)。对于懒人而言,挨个手动点击几百次按钮和坐牢无异,遂自己写了一个工具对大部分已明确的优化点进行一键修改(具体是使用lombok的@Data注解替换显式的getter/setter以及toString方法)。
本文内容主要分为三个部分,第一部分详细讲述工具实现的思路,第二部分会对用到的开源工具javaParser进行简要的介绍,第三部分提供了工具细致的使用说明。
02
实现思路
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
在翻阅历史代码时,发现不少工程仓库里很多类依然是用的IDE生成的getter/setter,如果使用Lombok的@Data注解替换,可以带来几个优点。
显而易见的是,能够使代码变得更加整洁,减少代码量,并且减少今后新增字段时带来的重复劳动。
可读性得到了提高,在其他同事参与开发时无需检查getter/setter里是否做了逻辑。
避免遗漏,减少犯错的风险,之前因为其他同事的接口数据漏写get方法,徒增了不少的沟通成本。
回过头来看,如果我们要写一个工具,对整个代码工程所有类进行全量扫描,并且使用lombok来替换其中的“没有特殊逻辑”的getter和setter,需要哪些步骤。
1.扫描整个工程代码,可以是多模块的工程。
2.读取其中的“.java”文件。
3.过滤其中不需要的类,例如interface,没有field的类(大概率是作为service出现),注解的声明等等。
4.删除getter/setter方法,这里需要判断在get和set方法里是否有特殊逻辑。
5.给类打上@Data注解,并且把lombok包引入进来。
6.把修改后的内容写入java文件。
下面对每个步骤的实现进行说明。
工程扫描
工程扫描比较简单,给一个工程路径,然后递归调用,过滤出所有的.java文件即可。
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注解。
7.添加lombok包的引入。
这里使用github上开源的工具javaParser来对类进行解析、代码提取、删除以及内容新增,javaParser会在下一章节进行介绍。
这里简单粗暴了一些,直接使用equals判断方法体,其实javaParser提供了更完善的api来分析语义。
更新java文件
在完成对代码的清理之后,需要将内容更新到java文件,CompilationUnit重写了toString方法,可以支持直接将代码转换成字符串的形式。
03
JavaParse介绍
理解,首先 MCube 会依据模板缓存状态判断是否需要网络获取最新模板,当获取到模板后进行模板加载,加载阶段会将产物转换为视图树的结构,转换完成后将通过表达式引擎解析表达式并取得正确的值,通过事件解析引擎解析用户自定义事件并完成事件的绑定,完成解析赋值以及事件绑定后进行视图的渲染,最终将目标页面展示到屏幕。
JavaParser是什么?
JavaParser 是一个开源的 Java 源代码分析工具,它提供了一系列简单的API来解析、修改和生成 Java 代码。
举个例子,我们可以使用javaparser轻松的实现下面几个操作:
1.分析代码中的类、方法、字段等元素,提取类的继承关系、方法的参数和返回类型等。
2.更改源码,例如重命名方法、修改方法体、添加或删除代码行等。
3.可以使用它来生成代码片段,例如创建新的类、方法或字段,或者生成代码文档。
领取专属 10元无门槛券
私享最新 技术干货