问题如下:
Java 中有一个庞大的代码库(数十个包中的数百个文件),我们需要能够在每个类定义中添加和删除关键字 strictfp。我打算使用 sed 或 awk 来执行此替换。但是,我想避免在评论或其他地方替换“类”这个词。谁能想到一个解决方案?
对于这样的任务,我首先建议编写一个小程序来验证*.class
目录树中的所有文件实际上是否具有(或不具有)正确的strictfp
设置。然后,无论你选择做什么来解决源代码修改问题,你都可以在编译器之后运行检查器,以确保你做了正确的事情。
这实际上只是应用于您的特定问题的 TDD。
你的代码格式有多标准?例如,您是否可以在以下一行结尾{
或下一行开头的行中查找“类” {
?
如果没有 java 解析器,就无法确定 100% 正确。但是,以下可能足够接近:
sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file
我想我的转义是对的,但我是从 Windows 机器上写的,还没有测试过。
如果您有“公共/私人/受保护”后跟“类”的评论,上述内容将会出错。
作为一个完整的包罗万象,不,没有 RegEx。您基本上需要编写一个 Java 解释器(或至少是一个解析器)来解释类的任何理论构造。话虽如此,如果单词 class 是该行的第一个非空白位,或者如果它前面有一个访问修饰符是该行的第一个非空白位,那么您确实应该是安全的。
我能想到两种可能:
这些都不是很令人满意。第一个实际上很难写,第二个很难写好。
我的建议是找到一个 RE 并将其放在源代码的本地副本上,然后检查所有更改。无论错误地进行了哪些更改,请调整 RE 并重试。
然后引入编码标准,逐步将所有不符合的定义改正。
由于您想在 strictfp 和 no strictfp 之间来回切换,因此最好在构建过程中修改 .class 文件。然后,您可以将此选择作为构建选项并切换它,而无需不断更改源文件。
星蓝:谢谢!通过查找 BCEL,我发现了 JMangler,它非常完美,因为我可以修改现有的 .class 文件以添加 strictfp 修饰符。 http://javalab.cs.uni-bonn.de/research/jmangler/tutorial/using.html
只是为了让人们知道,我最终决定使用 Javassist 而不是 BCEL,因为 Javassist 似乎更易于使用并且完全适合我的目的。http://csg.is.titech.ac.jp/~chiba/javassist。如果有人好奇,代码会是这样的:
import javassist.*;
ClassPool cp = new ClassPool();
CtClass someClass = cp.get("SomeClass");
someClass.setModifiers(Modifier.STRICT);