我同意 Seanizer 的回答,即您需要一个可以解析 Java 的工具。这是必要的,但还不够;你真正想要的是一个可以进行可靠的大规模更改的工具。
为此,您需要一个可以解析 Java、可以对已解析代码进行模式匹配、安装替换调用并在不破坏源代码的其余部分的情况下吐出答案的工具。
我们的DMS Software Reengineering Toolkit可以为各种语言(包括 Java)完成所有这些工作。它解析完整的 Java 源代码系统,构建抽象语法树(用于整个代码集)。
DMS 可以应用模式导向的源到源转换来实现所需的更改。
为了达到OP的效果,他将应用以下程序转换:
rule replace_legacy_log(s:STRING): expression -> expression
" log(\s) " -> " log( \s, \class\(\), \method\(\) ) "
这条规则的意思是,找到一个对 log 的调用,它有一个字符串参数,并将其替换为对 log 的调用,其中两个参数由辅助函数 class和method确定。
这些函数确定规则找到匹配项的 AST 节点根的包含方法名称和包含类名称。
该规则以“源格式”编写,但实际上与 AST 匹配,并用修改后的 AST 替换找到的 AST。
要取回修改后的源代码,您可以要求 DMS 简单地进行漂亮打印(以制作漂亮的布局)或保真打印(如果您希望保留旧代码的布局)。DMS 保留注释、数字基数等。\
如果现有应用程序对“日志”函数有多个定义,则需要添加一个限定符:
... if IsDesiredLog().
其中IsDesiredLog使用 DMS 的符号表和继承信息来确定特定日志是否引用了感兴趣的定义。