我有一个.java src文件,如下所示:
class Test { public void foo() { } }
我想以编程方式修改foo(),在某种意义上说,添加一个sysout并使它看起来像这样:
public void foo() { System.out.println("hello world"); }
有没有任何已知的方法可以通过不直接编辑src文件(RandomAccessFile)来做到这一点?
StackOverflow上的一些帖子引用了CodeModel和Eclipse JDT的AST来实现代码生成。我发现这些将有助于从头开始代码生成,而不是修改现有代码。是否有一个API可以让你修改现有代码,哪个API有一个像CodeModel / Eclipse JDT AST一样简单的API?如果没有,那么最好的方法是什么?
答案 0 :(得分:2)
您可以使用一些字节码操作库,例如JavaAssist。 请参阅javaassist教程中的 4.2更改方法体部分:http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html
答案 1 :(得分:0)
您可以使用JET模板或编写自定义注释处理器来实现代码生成。注意:另一方面,面向方面的框架在定义切入点时使用称为代码编织的概念来实现这一点。
答案 2 :(得分:0)
如果要修改源代码文件,则需要程序转换系统。 DMS Software Reengineering Toolkit是一个程序转换工具,可以读取源代码, 构建编译器数据结构(AST,符号表,流程图),允许您将源到源重写应用于表示为这些结构的代码,使用源模式匹配/替换,然后从结果中重新生成有效源。 / p>
DMS有许多语言的解析器/ prettyprinters,包括Java,C,C ++,C#,COBOL,PHP,JavaScript ......
答案 3 :(得分:0)
如果你坚持用代码生成来解决这个问题,你可以做的是为Test类生成一个Stub类,然后让Test类扩展Stub类。喜欢这个
class Test extends TestStub {
@Override
public void foo() {
super.foo();
}
}
// Generated stub class
class TestStub {
public void foo() {
System.out.println("hello world");
}
}
答案 4 :(得分:0)
如果您正在尝试编辑源代码而不是字节代码,可以使用Eclipse JDT的AST库的ASTRewrite类来修改现有的Java源代码文件。你可以在这里完善文档.. ASTRewrite
您可以在此处找到一些示例.. Using ASTRewrite