2012-05-14 3 views
12

私は特定のメッセージタイプを扱う多くのハンドラクラスを持っています。これらのハンドラをすべて登録するには、どのハンドラが存在するのかを知る必要があります。現在、それらはすべて特定のアノテーションでアノテートされており、Java 6アノテーション・プロセッサを使用してそれらのすべてを取得し、アノテートされた各タイプのインスタンスを保持するRegisterクラスを作成します。注釈プロセッサでソースツリー全体を調べるにはどうすればよいですか?

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

+0

どのアノテーションプロセッサを使用していますか? –

+0

一つ私はJava 6のAPI(javax.annotation.processing.AbstractProcessorの延長) –

+0

1を使用して、自分自身を書きました。私自身の調査から、これは利用できませんが、それが本当なら、それについて知りたいのです。 –

答えて

6

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

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

+0

どこでもこのコードを共有していますか?私はあなたのアプローチに興味があります。 –

+0

これは会社所有のコードですが、個人的なプロジェクトのためにこれを書くと利用可能になります –

+0

私は[generic library](https://github.com/sentinelt/evo-classindex)を書いていますこの。私の図書館は同じ問題を抱えているので、このページを見つけました... –

1

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

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

は、あなたがより良いおそらく Reflectionsのようなツールの助けを借りて、実行時に行われるだろう何をしているかのように聞こえます。

+1

これはAndroidのコードであり、Androidではこれらのフレームワークのほとんどが動作しないようです。どのような場合でもクラスパスのスキャンを避けたいと考えています。 RegisterHandlerClassルートに行った場合、どのように正確に役立つでしょうか?どのようにすれば、これらのクラスに適切なハンドラクラスを登録させることができますか? –

+0

ハンドラークラスがロードされていないという問題がある場合は、RegisterHandlerClassのアイデアも機能しません。ハンドラクラスごとに1つのリソースファイルを作成し、それらをすべて同じディレクトリに配置し、実行時にそのディレクトリをスキャンするだけで済みます。 –

関連する問題