如何优雅重构5万行Java代码:移除Getter/Setter的get/set前缀
大体积Java代码移除get/set前缀的重构方案
一、Eclipse IDE结构化重构(安全优先)
Eclipse的**结构化搜索与替换(SSR)**能精准识别方法签名,避免普通文本替换的误操作,适合大规模代码改造:
1. 批量改造Getter方法
- 打开结构化搜索面板:
Ctrl+H→ 切换到「Structured Search」标签 - 搜索模板输入:
public $ReturnType$ get$Name$() { return $Field$; } - 替换模板输入:
public $ReturnType$ $name$() { return $Field$; } - 变量配置:选中
$Name$变量,在右侧设置「Convert case」为「Lowercase first letter」,让$Name$(如Num)自动转为$name$(如num) - 先在单个类测试替换效果,确认无误后,选择「Search」→「Replace All」应用到整个项目
2. 批量改造Setter方法
根据你的Setter是否为链式调用(返回this),选择对应模板:
普通Setter(无返回值)
- 搜索模板:
public void set$Name$($ParamType$ $param$) { $Field$ = $param$; } - 替换模板:
public void $name$($ParamType$ $param$) { $Field$ = $param$; }
链式Setter(返回this)
- 搜索模板:
public $ReturnType$ set$Name$($ParamType$ $param$) { $Field$ = $param$; return $This$; } - 替换模板:
public $ReturnType$ $name$($ParamType$ $param$) { $Field$ = $param$; return $This$; } - 同样配置
$Name$转首字母小写,测试后批量替换
3. 批量修改调用处
用同样的SSR逻辑,搜索代码中调用getX()/setX()的地方:
替换Getter调用
- 搜索模板:
$Obj$.get$Name$() - 替换模板:
$Obj$.$name$()
替换Setter调用
- 搜索模板:
$Obj$.set$Name$($Arg$) - 替换模板:
$Obj$.$name$($Arg$)
二、Ubuntu命令行批量处理(高效快速)
用find+sed组合,适合纯文本层面的批量替换,务必先备份项目(如tar -czf project-backup.tar.gz /path/to/your/project):
1. 替换Getter方法定义
find /path/to/your/project -name "*.java" -exec sed -i 's/public \([^ ]\+\) get\([A-Z][a-zA-Z0-9_]*\)() {/public \1 \L\2\E() {/g' {} \;
2. 替换Setter方法定义
find /path/to/your/project -name "*.java" -exec sed -i 's/public \([^ ]\+\) set\([A-Z][a-zA-Z0-9_]*\)\(\([^)]*\)\) {/public \1 \L\2\E\3 {/g' {} \;
3. 替换代码中的Getter调用
find /path/to/your/project -name "*.java" -exec sed -i 's/\([a-zA-Z0-9_]\+\)\.get\([A-Z][a-zA-Z0-9_]*\)()/\1.\L\2\E()/g' {} \;
4. 替换代码中的Setter调用
find /path/to/your/project -name "*.java" -exec sed -i 's/\([a-zA-Z0-9_]\+\)\.set\([A-Z][a-zA-Z0-9_]*\)\(\([^)]*\)\)/\1.\L\2\E\3/g' {} \;
三、关键注意事项
- 优先用Eclipse SSR:能识别Java语法结构,避免误替换
getClass()这类系统方法,也能检测方法名冲突(如原有num()方法与改造后的getNum()转成num()冲突) - 备份优先:无论用哪种方案,先备份整个项目,避免不可逆错误
- 编译验证:替换完成后,全量编译项目,排查编译错误并手动修正特殊场景(如方法名冲突、重载方法冲突)
- 构建器补充:如果要完全对齐AWS SDK 2.x的构建器模式,可使用Eclipse的「Generate Builder」功能批量生成Builder类,再将原有
setX()调用替换为Builder的链式调用
内容的提问来源于stack exchange,提问作者algonell
相关产品推荐
相关产品推荐

