以编程方式编辑/修改.java文件? (不是.class文件)

时间:2010-02-25 12:19:23

标签: java code-generation

所以,这是一段使用CodeModel生成java代码的代码:

    JCodeModel cm = new JCodeModel();
    JDefinedClass dc = cm._class("foo.Bar");
    JMethod m = dc.method(0, int.class, "foo"); 
    m.body()._return(JExpr.lit(5));
    File f = new File("C:/target/classes");
    f.mkdirs();
    cm.build(f);

此代码生成.java文件:

package foo;
public class Bar {

       int foo() {
        return  5;
    }
}

但是,我不要希望CodeModel为我创建一个新的java文件。我已经有一个.java文件,并希望在其中的方法中添加几行代码。所以,我希望API直接修改java文件/创建它的修改后的副本。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:11)

我知道自原帖以来已经有一段时间了,但其中一个看起来比较容易理解的Java转换库似乎是Spoon

来自Spoon Homepage

  

Spoon使您可以转换(见下文)和分析(参见示例)   源代码。 Spoon提供了完整且细粒度的Java元模型   任何程序元素(类,方法,字段,语句,   表达式...)可以被读取和修改。   Spoon作为输入源代码并生成转换后的源代码   准备编译。

更新:Square还创建了JavaPoet源代码生成库,流畅的API看起来很简单,可以掌握。

答案 1 :(得分:2)

您真的需要完整解析要修改的代码,以确保将代码插入正确的位置。我认为你最好的选择是利用现有的解析工具,允许重写代码,而不是尝试手工做。

Eclipse IDE可以做这样的事情来支持代码重构。这个article可能会有所帮助。

答案 2 :(得分:2)

  

...我希望API直接修改java文件/创建它的修改后的副本。有没有办法做到这一点?

JavaParser是一个API,允许您读取Java文件,修改它们,并以String形式获取结果。

更具体地说,JavaParser解析文件并构建AST(抽象语法树)。然后,您可以使用API​​修改表示源代码的JavaParser AST,并检索AST的String表示。

  

我已经有一个.java文件,并希望在其中的方法中添加几行代码。

以下是使用JavaParser将一行添加到方法体末端并打印结果的示例:

class MyClass {
    public static void someMethod() {
        /* ... */
        // Lines will be added here:
    }

    public static void main(String[] args) {
        String newStatement = "System.out.println(\"Hello world!\");"
        File myClassSourceFile = new File("MyClass.java");
        CompilationUnit cu = JavaParser.parse(myClassSourceFile);
        ClassOrInterfaceDeclaration classDeclaration = cu.getClassByName("MyClass").get();
        MethodDeclaration method = classDeclaration.getMethodsByName().get(0);
        method.getBody().get().addStatement(newStatement);

        // Print out the resulting Java source code.
        System.out.println(cu.toString());
    }
}

CompilationUnit - 来自JavaParser的javadoc,"此类代表整个编译单元。每个java文件表示一个编译单元。"

注意:在您的代码中,您需要使用适当的可选处理替换Option.get()调用。

答案 3 :(得分:-1)

你想要的是program transformation system。这是一个解析源文件的工具,可以 应用转换来修改它,重新生成带有修改的源代码。

源到源转换系统接受以下形式的规则:

lhs -> rhs  if cond

其中 lhs rhs 是该语言的有效片段的源模式, cond 检查该规则是否可以安全应用。 (考虑“?x /?x - > 1,如果?x~ = 0”;您需要条件来验证除法是否有效。)

我们的DMS Software Reengineering Toolkit就是这样一个工具。 DMS具有完整的C,C ++,C#,Java,COBOL,Python,PHP和ECMAScript前端解析器(与许多鲜为人知的语言一样)并且可以直接应用这些规则。 DMS还提供符号表构造和控制以及数据流分析,因为这些通常可用于为复杂规则定义 cond 。如果需要,您还可以回退到“标准”程序界面来访问树节点并修改AST。