Java代码生成:如何修改现有Java文件中的方法?

4

我有一个 .java 的源代码文件,看起来像这样:

class Test {
public void foo() { }
}

我想以编程的方式修改foo(),例如添加一个sysout,并使其看起来像这样:

public void foo() {
    System.out.println("hello world");
}

有没有已知的方法可以通过不直接编辑源代码文件(RandomAccessFile)来实现此操作?

StackOverflow上的一些帖子提到了CodeModel和Eclipse JDT的AST用于代码生成。 我发现这些将有助于从头开始生成代码,而不是修改现有代码。 是否有一个API可以让您修改现有代码,并且具有与CodeModel / Eclipse JDT的AST一样简单的API? 如果没有,最好的方法是什么?


2
你为什么想要这样做?这是一个必须通过代码生成才能解决的问题吗? - Thomas Jung
@Thomas Jung:有很多情况下,“字节码插桩”是非常有用的。 - SyntaxT3rr0r
5个回答

2

@uthark:“源代码插桩”!=“字节码插桩”。原文特别提到了源代码和AST,因此建议使用字节码插桩似乎不正确。 - SyntaxT3rr0r
@uthark:抱歉,我看错了问题,他实际上是在寻找字节码插装。不知怎么回事,我以为他是在寻找源代码插装。 - SyntaxT3rr0r

0

您可以使用JET模板或编写自定义注释处理器来实现代码生成。请注意:另外,面向方面的框架使用称为代码织入的概念来实现这一点,当定义切入点时。


0
如果您想修改源代码文件,您需要一个程序转换系统。DMS软件重构工具包是一种程序转换工具,它将读取源代码,构建编译器数据结构(AST、符号表、流程图),允许您对表示为这些结构的代码应用源到源的重写,使用源模式进行匹配/替换,然后从结果重新生成有效的源代码。
DMS拥有许多语言的解析器/美化程序,包括Java、C、C++、C#、COBOL、PHP、JavaScript等。

0

如果您坚持使用代码生成来解决这个问题,您可以为Test类生成一个存根类,然后让Test类扩展该存根类。像这样:


class Test extends TestStub {
  @Override
  public void foo() {
    super.foo();
  }
}
// 生成的存根类
class TestStub {
  public void foo() {
    System.out.println("hello world");
  }
}

0
如果您想编辑源代码而不是字节码,可以使用Eclipse JDT的AST库中的ASTRewrite类来修改现有的Java源代码文件。您可以在此处找到文档:ASTRewrite
您可以在此处找到一些示例:Using ASTRewrite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接