3

構文的に無効である可能性のあるコード スニペットを含む Java ソース コードを作成したいと考えています。これはcom.sun.codemodel.JBlock#directStatement() メソッドで可能です。

私の問題は、既存の (構文的に有効な) ソース ファイルを変更したいのですが、ファイル (または String や Stream など) から JCodeModel を作成する方法が見つからないことです。

JCodeModel でこれを行う方法はありますか?

(代わりに Eclipse JDT/AST フレームワークを使用することもできますが、コード スニペットを直接追加するオプションは提供されていないようです ...)

4

3 に答える 3

1

JavaParserを使用してコードを効果的に解析し、解析の結果を取得して、JCodemodel で操作を行うことができます。

于 2013-02-12T10:45:28.457 に答える
0

IMHOアプローチは次のようになります。

  • あなたが達成しようとしていることを見てみてください

    既存の (構文的に有効な) ソース ファイル

  • 次に、継承または生成されたクラスのクラスの包含によってそれらを変更せずにそれを実行できるかどうかを判断します。これにより、生成されたコードと既に作成されたコードが明確に分離されます。

  • 不可能な場合は、既存の (構文的に有効な) クラスで訪問者のようなデザイン パターンを使用し、生成されたコード クラスのインスタンスをそれに挿入して、ジョブを完了してください。

  • 最悪の場合 - 最後のオプションは、既存のクラスを実際に変更することです。

于 2014-12-12T01:58:07.837 に答える
-1

JAVAコード操作(プログラムからのJAVAコードで操作するのは非常に複雑です)ではなく、JAVAバイトコード操作を使用することをお勧めします。頻繁に使用される3つのバイトコードマニピュレータは次のとおりです。

本当にソースコードで操作する必要がある場合は、 EclipseJDTおよびASTRewriteクラスを確認できます。以下は、メソッドを作成する方法の例であり、

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

チュートリアル:

于 2012-12-25T21:10:31.750 に答える