0

私は、多くの Java コードを生成する API を使用しています。

ただし、この API はインポートを正しく処理しないため、すべてのクラスの完全修飾名を記述します。例えば:

public class Foo{
    com.my.company.Bar bar;
    public com.my.company.Bar getBar(){
      return bar;
    }
}

この生成されたコードを後処理する API を見つけて、そのようなものを書きたいと思います。

import com.my.company.Bar;

public class Foo{
    Bar bar;
    public Bar getBar(){
      return bar;
    }
}

それを行うことができる既知の API はありますか?

4

2 に答える 2

0

私が見る限り、あなたは Java コードを正しく生成することを期待していますか? もし、そうなら 。Eclipse JDTからのプロジェクトで使用しており、 Javaコード生成Eclipse IDEに使用しています。そして、私はそれを使用することをお勧めしますが、必要に応じて、単純なソリューションやその他のソリューションを使用することもできます。QDox

解決策のいずれかを検討できます

  • エクリプス JDT
  • Javaパーサー
  • キュードックス

エクリプス JDT

長所

  • 印象的な機能
  • 非常に豊富な API
  • Java 7 機能のサポート。Java 8 機能もサポートする計画があります。
  • ローカライズ可能な構文エラー メッセージ

短所

  • 急な学習曲線

リソース Eclipse JDT の紹介

http://www.eclipse.org/articles/article.php?file=Article-JavaCodeManipulation_AST/index.html

Eclipse 以外で JDT API を使用する方法

Eclipse 以外のプロジェクトで Java Eclipse 抽象構文ツリーを使用するにはどうすればよいですか? (つまり、Eclipse プラグインではありません)

ASTの良い例とプロジェクト

http://www.ibm.com/developerworks/opensource/library/os-ast/

Eclipse jar プラグイン ソースにアクセスする

http://www.vogella.de/articles/EclipseCodeAccess/article.html

テストサンプル

http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/tree/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests

キュードックス

プロの

  • ゼロから構築して変更する
  • 軽量
  • FQN タイプによる検索
  • クリーンで読みやすい API
  • isFinal()、isPrivate() などの広範なクエリの可能性
  • オブジェクト指向の構造体であり、Java ファイル内のほぼすべてのものを、JavaClass、JavaField、JavaMethod、JavaParmeter などのオブジェクトで表すことができます。

短所

  • 最後のパブリック リリースは 2009 年 9 月 4 日の 1.10 でしたが、2.0 スナップショットは利用可能です。
  • 1.10 は静的インポートをサポートしていません。
  • ファイルへの書き込みは事前にフォーマットされており、あまり制御できず、行番号を指定できません
  • 記事やチュートリアルはありません。ソース コードが唯一のリファレンスです

リソース - Qdox http://qdox.codehaus.org/changes-report.html

于 2013-11-08T15:39:11.330 に答える
0

既存のコードからのインポートのフィルタリングは簡単ではありません。名前が同じでパッケージが異なる 2 つのクラスがあるとします。

私の通常のアプローチは、インポートを管理するヘルパー クラスを用意することです。ジェネレーターでは、できる

String type = importSet.add(Foo.class);

typeその後、型にアクセスするためにメソッドで使用されます。インポート セットはすべてのインポートを収集し、重複を処理します。

これが機能するには、次の「メイン ループ」が必要です。

importSet = new ImportSet();
String body = generateClass();

out.write(importSet);
out.write(body);

つまり、最初にクラス自体のすべてのコードを生成する必要があります (インポートを収集します) 。次に、インポートをファイルに書き込み、その後、生成されたクラス本体を書き込みます。

ソースを変更したい場合は、コードの AST を取得できるEclipse Java コンパイラを使用することをお勧めします。その後、このツリーにさまざまな変換を適用できます。ブログに AST を取得する方法の例があります。

于 2013-11-08T14:48:05.297 に答える