6

最近、いくつかの Java コードを変更する必要が生じました (メソッドの追加、いくつかのフィールドの署名の変更、およびメソッドの削除)。これはすべて、Eclipse SDK の AST を使用して達成できると思います。

ソースファイルを解析する方法はいくつかの調査から知っていますが、上記のことを行う方法がわかりません。誰かが良いチュートリアルを知っていますか、またはこれらの問題を解決する方法について簡単に説明してもらえますか?

どうもありがとう、

エクストリームコーダー


編集:

私は今、JCodeModel をもっと調べ始めました。これはもっと使いやすいと思いますが、既存のドキュメントをロードできるかどうかはわかりません。

これが機能する場合はお知らせください;)

再度、感謝します。

4

2 に答える 2

4

この問題のソース コード全体は非常に長いので、ここでは投稿しませんが、人々に始めてもらいたいと思います。

必要なドキュメントはすべてここにあります: http://publib.boulder.ibm.com/infocenter/iadthelp/v6r0/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org /Eclipse/jdt/core/dom/package-summary.html

Document document = new Document("import java.util.List;\n\nclass X\n{\n\n\tpublic void deleteme()\n\t{\n\t}\n\n}\n");
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(document.get().toCharArray());
CompilationUnit cu = (CompilationUnit)parser.createAST(null);
cu.recordModifications();

これにより、渡したソース コードからコンパイル ユニットが作成されます。

これは、渡されたクラス定義内のすべてのメソッドを出力する単純な関数です。

List<AbstractTypeDeclaration> types = cu.types();
for(AbstractTypeDeclaration type : types) {
    if(type.getNodeType() == ASTNode.TYPE_DECLARATION) {
        // Class def found
        List<BodyDeclaration> bodies = type.bodyDeclarations();
        for(BodyDeclaration body : bodies) {
            if(body.getNodeType() == ASTNode.METHOD_DECLARATION) {
                MethodDeclaration method = (MethodDeclaration)body;
                System.out.println("method declaration: ");
                System.out.println("name: " + method.getName().getFullyQualifiedName());
                System.out.println("modifiers: " + method.getModifiers());
                System.out.println("return type: " + method.getReturnType2().toString());
            }
        }
    }
}

これですべての作業を開始できます。

これに慣れるには時間がかかります(私の場合はかなり)。しかし、それは機能し、私が手に入れることができる最良の方法です.

幸運を ;)

エクストリームコーダー


編集:

忘れる前に、これらはこれを機能させるために使用したインポートです (これらを整理するのにかなりの時間がかかりました)。

org.eclipse.jdt.core_xxxx.jar
org.eclipse.core.resources_xxxx.jar
org.eclipse.core.jobs_xxxx.jar
org.eclipse.core.runtime_xxxx.jar
org.eclipse.core.contenttype_xxxx.jar
org.eclipse.equinox.common_xxxx.jar
org.eclipse.equinox.preferences_xxxx.jar
org.eclipse.osgi_xxxx.jar
org.eclipse.text_xxxx.jar

xxxx はバージョン番号を表します。

于 2010-07-28T14:52:40.693 に答える
1

AST を操作できる API を呼び出すことにより、Eclipse でこれを行うことができます。

または、プログラム変換を適用して、AST の微視的な詳細に依存しない方法で効果を実現することもできます。

例として、次のプログラム変換を記述できます。

add_int_parameter(p:parameter_list, i: identifier): parameters -> parameters
  " \p " -> " \p , int \i";

パラメータ リストに任意の名前の整数パラメータを追加します。これは、API 呼び出しのセット全体と同じ効果を実現しますが、言語 (この場合は Java) の表面的な構文であるため、はるかに読みやすくなっています。

当社のDMS Software Reengineering Toolkitは、このようなプログラム変換を受け入れ、Java を含む多くの言語に適用できます。

于 2010-07-31T05:11:08.493 に答える