2010-02-10 47 views
4

我有一个.java文件的src看起来像这样:Java代码生成:如何修改现有的java文件方法?

 
class Test { 

    public void foo() { 
    } 

} 

我想修改FOO()编程,在这个意义上,说增加一个系统输出,使它看起来像这样:

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

是否有任何已知的方式来通过不直接编辑src文件(RandomAccessFile)来做到这一点?

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

+2

你为什么要这么做?这是没有代码生成就无法解决的问题吗? – 2010-02-10 15:11:40

+0

@Thomas Jung:“字节码检测”有用的情况很多。 – SyntaxT3rr0r 2010-02-10 15:24:20

回答

2

您可以使用一些字节码操作库,例如JavaAssist。 见部分4.2改变的方法体在教程javaassist:http://www.csg.is.titech.ac.jp/~chiba/javassist/tutorial/tutorial2.html

+0

@uthark:“源代码工具”!=“字节代码工具”。原来特意谈到了src代码和AST,因此暗示字节代码检测看起来不正确。 – SyntaxT3rr0r 2010-02-10 15:20:29

+0

@uthark:哎呀抱歉,我误解了这个问题,他实际上是在字节码检测之后。不知何故,我认为他是在源代码工具之后。 – SyntaxT3rr0r 2010-02-10 15:27:50

+0

@uthark JavaAssist,不适用于java 1.5 :-( – Jay 2010-02-11 06:33:37

0

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

0

如果你想修改一个源代码文件,你需要一个程序转换系统。 DMS Software Reengineering Toolkit是一个程序转换工具,它将读取源代码, 构建编译器数据结构(AST,符号表,流图),允许使用源模式将源到源重写应用于表示为这些结构的代码匹配/替换,然后从结果中重新生成有效的源。

DMS有许多语言,包括Java,C,C++,C#,COBOL,PHP,JavaScript中,解析器/ prettyprinters ...

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");
  }
}
0

如果你想编辑的源代码,而不是字节码,您可以使用ASTRewrite类的Eclipse JDT的AST库修改现有的Java源代码文件。您可以在这里很好的文档.. ASTRewrite

你可以在这里找到一些样本.. Using ASTRewrite