2012-12-12 26 views
3

我想创建Java源代码,其代码片段可能在语法上无效。这可能与com.sun.codemodel.JBlock#directStatement() method从现有的源文件创建JCodeModel

我的问题是,我想修改现有的(语法上有效的)源文件,我找不到从文件(或字符串或流等)创建JCodeModel的方法。

有没有办法用JCodeModel做到这一点?

(我可以使用Eclipse JDT/AST框架代替,但它apparently doesn't offer the option to add code snippets directly ...)

+0

这是posiible从源文件得到JCLASS对象。不幸的是,我找不到从它得到一个JDefinedClass的方法。你确实可以从它得到一个JCodeModel,但是它的包中不包含任何JDefinedClass对象。 – Morrandir

+0

你试过这个吗? http://stackoverflow.com/questions/2333866/editing-modifying-a-java-file-programmatically-not-the-class-file – pratikch

+0

你能把精确的代码发布到你的问题中吗? –

回答

0

我建议你不要使用JAVA代码操作(这是相当复杂的与JAVA程序代码来操作) ,但是JAVA字节码操作。 3个常用的字节码操纵器:

如果你真的需要的源代码来处理,您可以检查Eclipse JDTASTRewrite类。波纹管是一个示例如何创建方法和

final ASTRewrite rewrite= new ASTRewrite(root); 
root.accept(new ASTVisitor() { 
public boolean visit(Assignment assignment) { 
    // check if affected 
    AST ast= assignment.getAST(); 
    MethodInvocation setter= ast.newMethodInvocation(); 
    setter.setName(ast.newSimpleName(setterName)); 
    setter.arguments().add(
    rewrite.createMoveTarget(assignment.getRightHandSide())); 
    rewrite.replace(assignment, setter); 
} 
}); 

教程:

+0

不幸的是,这不是一个选项。我创建了教育软件,UML活动图被翻译成Java源代码,这是学生的直接输出/反馈。 – Morrandir

+0

在这种情况下,Eclipse JDT的ASTRewrite可以是一个选项。请看看收到的答案。 –

+0

随着JDT我有问题插入语法无效的代码:http://stackoverflow.com/questions/13801305/how-to-add-a-code-snippet-to-method-body-with-jdt-ast – Morrandir

1

您可以使用​​为您的代码和解析结果进行有效的解析,您可以使用JCodemodel进行操作。

0

恕我直言,一种方法可能是这样的。

  • 试试,看你想什么来实现与

    现有的(语法有效)的源文件

  • 然后计算出,如果你能做到这一点,而不通过修改它们继承或包含生成的类中的类。这将在生成的和已经创建的代码中提供明确的分离。

  • 如果不可能,请尝试在现有的(语法有效的)类中使用像visitor一样的设计模式,并将生成的代码类实例注入到其中以完成作业。

  • 最糟糕的情况 - 最后的选择将是真正修改现有的类。