web-dev-qa-db-ja.com

Javaでビルド時にアノテーションを使用してコードを動的に生成するにはどうすればよいですか?

コードを生成するためのソリューションを探しています。私はグーグルで検索し、SOといくつかのブログを検索しましたが、良い解決策は見つかりませんでした。

クラスにアノテーションを付けたいのですが、コンパイル時に、いくつかのメソッドとプロパティが自動的にクラスに追加されます。

私が探しているソリューションの要点:

  • カスタマイズ可能な生成コード(必須)
  • aptのような外部ツールを呼び出す必要はありません(必須)
  • JDKのみ、サードパーティのフレームワークはありません(必須 オプション)
  • カスタマイズ可能な注釈名(オプション)

例えば ​​:

@Aliasable
public class MyClass {
//Some properties

// Contructor ...

// Some methods
}

私のクラスはコンパイル後は次のようになります:

public class MyClass {
   //Some properties
   private String alias;

   // Contructor ...

   // Some methods
   public String getAlias() {
      return alias;
   }

   public void setAlias(String alias) {
      this.alias=alias;
   }
}

編集:
最後に、3番目の要件をMANDATORYからOPTIONALに変更し、 project Lombok (MavenおよびEclipseとの統合が簡単で、使用するための作業はほとんどありません)を選択しました。

23
Stephan

Project Lombok をご覧ください。あなたが書くときにあなたが尋ねるようにそれはコードを生成します:

public class MyClass {
  @Getter @Setter private String alias;
}

また、必要に応じてさらに多くのことを行います。外部ツールを要求しなかったのは知っていますが、基本的にはこれを再現します。

12
jackrabbit

注釈処理ツール はバージョン1.6以降javacに統合されており、 JDKの一部 。したがって、Pluggable Annotation APIを使用する場合、外部ツールは必要ありません。 Mirror API を使用して、カスタムアノテーションまたはメソッド/パラメーター/フィールド/クラス宣言を分析することにより、任意のコードを生成できます。

アノテーションプロセッサAPIは、既存のクラスを変更してはならないと言っています。代わりに、既存のクラスのサブクラスを生成し、それらのサブクラスに拡張メソッドを作成する必要があります。

とにかくクラスを変更することは可能であるようですが(たとえば、バイトコード操作ライブラリを使用することによって)、仕様とは対照的であり、他のアノテーションプロセッサで問題が発生する可能性があり、すべてのコンパイラで同じように機能するとは限りません。

14
kapex

XMLとXSLTを使用してコードを生成します。これは、ビューのEJB、ロジック、およびCRUD部分に使用されます。実行時に生成されるのではなく、ビルドサーバー上で生成されます。開発者は、井戸開発の目的でコードを手動で生成できます。これは、ANTがビルドサーバーで使用するのと同じコマンドで実行されます。

生成はXMLとXSLTを使用するため、高度にカスタマイズできます。

あなたがグーグルならJava code generation with XSLTあなたはたくさんの例に出くわすでしょう。この手法は2000年までさかのぼり、したがって、おそらく今ではより簡単な解決策が先行していることに注意してください。