27

私は間違った方向を見ているだけかもしれませんが、注釈処理に関する JSE ドキュメントは非常に...まばらです。注釈付きの String フィールドとローカル変数を処理して、それらを計算された String 式に置き換える注釈プロセッサを作成したいと考えています。これはそれほど複雑ではありませんが、javax.annotation.processing の Javadoc でかなり迷っています。

編集:生成されたコードを変更したいので、コンパイル時に注釈を処理する必要があります。注釈付きの定数文字列式を計算された文字列式に置き換える必要があります。

4

3 に答える 3

15

これは、コンパイル時の注釈プロセッサでは実行できません。コンパイル時の注釈プロセッサは、新しいファイル (およびクラス) のみを生成でき、既存のクラスを変更することはできません。実行時にリフレクションを行うことはできますが、厳密にはアノテーション処理とは言えません。また、ローカル変数にはアクセスできません。

コンパイル時の注釈プロセッサを作成する方法を探している場合は、https://github.com/pellaton/spring-configuration-validation-processorを確認してください。

于 2012-07-08T18:46:42.740 に答える
8

これを行う 2 つのツールはProject LombokDuctileJです。これらのツールは両方とも、質問が最初に尋ねられた時点で存在していました。追加のツールが確実に存在するようになりました。

重要なアイデアは、コード生成の前に、コンパイル中にプログラムの AST (抽象構文ツリー) をトラバースして変更する注釈プロセッサを作成することです。コンパイラはディスク上のソース コードを変更しませんが、生成された .class ファイルには、注釈プロセッサが行った変更が反映されます。

これらのツールの 1 つをニーズに合わせて調整したり、それらの実装技術に触発された独自のツールを実装したりできます。

コンパイル時の処理には、クラスファイルの処理に比べて 2 つの利点があります。1 つは、コンパイラは通常、コンパイルされたコードから得られる情報よりも多くの情報を持っていることです。もう 1 つは、開発者がコンパイル後に別のツールを実行して .class ファイルを書き換える必要がなく、コンパイル中にすべてが 1 つのステップで行われることです。

于 2015-02-21T14:16:01.747 に答える
4

小切手

于 2012-07-08T22:05:43.140 に答える