所以,这是一段使用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文件/创建它的修改后的副本。有没有办法做到这一点?
答案 0 :(得分:11)
我知道自原帖以来已经有一段时间了,但其中一个看起来比较容易理解的Java转换库似乎是Spoon。
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。