2012-12-12 50 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一樣的設計模式,並將生成的代碼類實例注入到其中以完成作業。

  • 最糟糕的情況 - 最後的選擇將是真正修改現有的類。