4

Eclipse 機能の「実装されていないメソッドを追加する」に似たハックを実装する方法を見つけようとしています。

コードの作成中にこれらのメソッドを追加する代わりに、コンパイル中にこれを行い、テンプレートを使用してメソッド本体を生成したいと思います。さらに、元の .java ソース ファイルを変更したくありません。

たとえば、次のものがあるとします。

interface I { void foo(); }
class C implements I { 
  public static void main(String[] args) { new C().foo(); }
}

これをコンパイルすると、I.foo実装されていないため、通常はエラーが発生します。

代わりに、コンパイルを成功させ、その後の実行でテンプレートを使用したいと思います。メソッドと実装されたインターフェイスに関する詳細情報を取得してテンプレートで使用できる{throw UnsupportedOpeationException()ようにしたいのですが、それは難しくありませんか?

私が最初に考えたのは、注釈 ( ) を試すAutoImplementMethodsことでしたが、注釈プロセッサは処理中の注釈付きコードを変更できません。

私はある程度快適ですAspectJが、型間宣言を使用してそれを行う方法がわかりません。

自分のJavaパーサーを使用してコードコードを生成する以外に、これを行う方法について何か提案はありますか?

4

2 に答える 2

6

Lombokはあなたが望むものと似たようなことをするので、プロジェクトlombokを見てください。

ロンボクはこの情報源を利用します、

public class GetterSetterExample {
  @Getter @Setter private int age = 10;
  @Setter(AccessLevel.PROTECTED) private String name;

  @Override public String toString() {
    return String.format("%s (age: %d)", name, age);
  }

次のようなクラスを生成します。

public class GetterSetterExample {
  private int age = 10;
  private String name;

  @Override public String toString() {
    return String.format("%s (age: %d)", name, age);
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  protected void setName(String name) {
    this.name = name;
  }
}

Lombokは、JSR 269 Pluggable AnnotationProcessingAPIを使用します。

ここにロンボクがどのように機能するか、そしてあなた自身の変換を追加する方法を説明する記事があります。

于 2013-02-14T02:19:27.357 に答える
2

JDT Eclipse を使用してコード インジェクションを行いました。あらゆる種類のバインディングが解決された Java ファイルの抽象構文木 (AST) を生成します。JDT を使用すると、コードを構文ツリー レベルで直接変更できます。ここにいくつかの便利なリンクがあります:

JDT チュートリアル

JDT 開発者ガイド

于 2013-02-07T00:22:03.493 に答える