12

特定のメッセージタイプを処理するハンドラークラスがたくさんあります。これらすべてのハンドラーを登録するには、どのハンドラーが存在するかを知る必要があります。現在、それらはすべて特定のアノテーションで注釈が付けられており、Java 6アノテーションプロセッサを使用してそれらすべてを取得し、注釈付きの各タイプのインスタンスを保持するRegisterクラスを作成します。

これは、ツリー全体を一度にビルドする場合にうまく機能しますが、注釈付きクラスの1つだけをビルドする場合(たとえば、ファイルをEclipseに保存する場合)、プロセッサーはそのタイプのみを認識し、不完全なレジスターをビルドします。このシナリオで他のタイプを調べるにはどうすればよいですか?

4

2 に答える 2

6

私は今のところこれを十分に解決しました。私がやったことはちょっとしたハッキーですが、基本的に私が見るすべての注釈付きクラスについて、その名前をHashSetに追加します。次に、Filer.getResource()を使用して、以前に表示されたすべての注釈付きクラスを記録したファイルを開き、それらもHashSetに追加します。次に、レジスタクラスを生成し、Filer.createResource()を使用してHashSet全体を同じリソースに書き込みます。注釈付きタイプは引き続きそのファイルに記録されるため、これを削除すると問題が発生しますが、プロジェクトをクリーンアップするか、そのファイルを削除して解決することができます。

編集:また、適切な「元の要素」をFiler.createSource()に渡すことで、Eclipseがそれらの依存関係を適切に追跡できるようになるはずですが、そうではありません。おそらくそれはEclipseのバグです。

于 2012-05-22T21:20:11.410 に答える
1

当然のことながら、コンパイル時の注釈プロセッサは、コンパイルされるファイルのみを処理します。Eclipseはインクリメンタルコンパイルを使用して時間を節約するため、簡単に言うと、アノテーションプロセッサが1回のパスですべてのタイプを表示することは期待できません。

1つの解決策は、インクリメンタルコンパイルをサポートするようにアーキテクチャを変更することです。たとえば、注釈付きのごとに、そのハンドラクラスを登録 HandlerClassするクラスを生成します。RegisterHandlerClass

そうは言っても、おそらくReflectionsのようなツールの助けを借りて、実行時に実行したほうがよいように思えます。

于 2012-05-17T01:49:17.377 に答える