代码之家  ›  专栏  ›  技术社区  ›  Chinmay Kanchi

Java中类定义的正则表达式

  •  1
  • Chinmay Kanchi  · 技术社区  · 17 年前

    问题如下:

    Java中有大量的代码库(在几十个包中有数百个文件),在这里我们需要在每个类定义中添加和移除关键字StuttFP。我计划使用SED或AWK来执行这个替换。但是,我想避免在评论或其他地方使用“class”这个词来代替它。有人能想出解决办法吗?

    8 回复  |  直到 17 年前
        1
  •  1
  •   starblue    17 年前

    由于您希望在strictfp和no strictfp之间来回切换,因此最好在构建过程中修改.class文件。然后,您可以将此选项设置为构建选项,并在不不断更改源文件的情况下切换它。

        2
  •  2
  •   Greg Hewgill    17 年前

    对于这样的任务,我首先建议编写一个小程序来验证 *.class 目录树中的文件实际上具有(或不具有)正确的 strictfp 设置。然后,无论您选择做什么来解决源代码修改问题,您都可以在编译器之后运行检查程序,以确保您做了正确的事情。

    这实际上只是适用于您的特定问题的TDD。

        3
  •  1
  •   Amber    17 年前

    您的代码格式有多标准?例如,您能在以“class”结尾的行中查找“class”吗? { 或者下一行从哪里开始 { 或者是这样的?

        4
  •  1
  •   ehempel    17 年前

    如果没有Java解析器,就无法确定获得100%的正确性。但是,以下可能足够接近:

    sed -i.bak 's/\\(public\\|private\\|protected\\)\\(.*\\)class/\\1 strictfp \\2 class/g' $file
    

    我想我找到了逃犯,但我是从一台Windows机器上写的,还没有测试过。

    如果您在“public/private/protected”后面加上“class”,那么上面的注释将中断。

        5
  •  1
  •   Adam Robinson    17 年前

    作为一个完整的捕获,不,没有regex。本质上,你需要编写一个Java解释器(或至少一个解析器)来解释一个类的任何理论构造。也就是说,如果单词class是行中的第一个非空白位,或者它前面有一个访问修饰符,它是行中的第一个非空白位,那么您应该是安全的。

        6
  •  1
  •   paxdiablo    17 年前

    我可以想到两种可能性:

    • 使用解析器而不是正则表达式(res不是用于 一切 )解析器将更好地理解语言语法。
    • 使代码基保持一致,这样就不会拾取错误的“类”字符串。

    这些都不是很令人满意。第一个很难写,第二个很难写对。

    我的建议是找到一个re并在源代码的本地副本上释放它,然后检查所有的更改。无论错误中做了什么更改,调整re并重试。

    然后引入编码标准,逐步改变所有不符合的定义,使之正确。

        7
  •  0
  •   Chinmay Kanchi    17 年前

    斯塔布鲁:谢谢!通过查找bcel,我发现jmangler是完美的,因为我可以修改现有的.class文件来添加strictfp修饰符。 http://javalab.cs.uni-bonn.de/research/jmangler/tutorial/using.html

        8
  •  0
  •   Chinmay Kanchi    17 年前

    为了让人们知道,我决定最终使用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);