Java でビルド時にアノテーションを使用してコードを動的に生成するにはどうすればよいですか?
-
28-10-2019 - |
質問
コードを生成するためのソリューションを探しています。Googleで検索したり、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 番目の要件を「必須」から「任意」に変更し、次のことを選択しました。 プロジェクトロンボク (MavenおよびEclipseとの簡単な統合、それを使用するための作業は事実上ありません)。
解決
見て プロジェクト・ロンボク. 。次のように記述すると、要求に応じてコードが生成されます。
public class MyClass {
@Getter @Setter private String alias;
}
必要に応じて、さらに多くのことを実行します。外部ツールを要求していないことは承知していますが、基本的にはこれを再作成することになります。
他のヒント
の アノテーション処理ツール に統合されています ジャバック バージョン 1.6 以降、 JDK の一部. 。したがって、使用時に外部ツールは必要ありません。 プラグイン可能なアノテーション API. 。カスタム アノテーションまたはメソッド/パラメータ/フィールド/クラス宣言を分析することで、任意のコードを生成できます。 ミラーAPI.
アノテーション プロセッサ API では、既存のクラスを変更すべきではないと述べています。代わりに、既存のクラスのサブクラスを生成し、それらのサブクラスに拡張メソッドを作成する必要があります。
とにかくクラスを変更することは可能のようです(例:ただし、これは仕様に反しており、他のアノテーション プロセッサで問題が発生する可能性があり、すべてのコンパイラで同じ方法で動作するとは限りません。
XML と XSLT を使用してコードを生成します。これは、EJB、ロジック、およびビューの CRUD 部分に使用されます。実行時に生成されるのではなく、ビルドサーバー上で生成されます。開発者は、井戸開発の目的でコードを手動で生成できます。これは、ANT がビルドサーバーで使用するのと同じコマンドで実行されます。
XML と XSLT を使用して生成されるため、高度にカスタマイズ可能です。
グーグルで検索すると Java code generation with XSLT
たくさんの例に遭遇するでしょう。この手法の起源は 2000 年頃のものであるため、おそらく今ではより簡単な解決策が先行していることに注意してください。