代码手术刀—自定义你的代码重构工具
前言
笔者近日在做代码仓库的存量代码缩减工作,首先考虑的是基于静态扫描的缩减,尝试使用了很多工具来对代码进行优化,例如PMD、IDEA自带的inspect功能、findBugs等。但是无一例外,要么过于“保守”,只给出扫描结果,但是无法实现一键优化,要么直接就是有bug(这里特指IDEA2023.1.5专业版-inspect功能扫描problems清单里的unused declaration)。对于懒人而言,挨个手动点击几百次按钮和坐牢无异,遂自己写了一个工具对大部分已明确的优化点进行一键修改(具体是使用lombok的@Data注解替换显式的getter/setter以及toString方法)。
本文内容主要分为三个部分,第一部分详细讲述工具实现的思路,第二部分会对用到的开源工具javaParser进行简要的介绍,第三部分提供了工具细致的使用说明。
实现思路
在翻阅历史代码时,发现不少工程仓库里很多类依然是用的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