POJO であるメッセージをやり取りする小さなアプリケーションを開発しています。処理できるメッセージの種類のレジストリを作成したいと思います。私は当初、次のようにそれらを列挙型に貼り付ける予定でした。
public enum Message
{
INIT( InitMessage.class, "init" ),
REFRESH( RefreshMessage.class, "refresh" );
private Message( Class<?> messageClass, String messageCode )
// etc..
}
許可されたクラスを管理するために中央の列挙型を維持する必要があるため、このアプローチは好きではありません。代わりに、POJO に注釈を付けたいと思います。
@MessageDefinition( "init" )
public class InitMessage
{
// .. some properties with appropriate getters and setters
}
Subversion から Tomcat のソースをチェックアウトしましたが、IDE の助けを借りても、抽象化のレベルを通り抜けて、クラスをwebapp は、@WebServlet、@WebListener などを登録するためにアノテーション付きクラスを検索します。さらに不快だったのは、テスト クラスでこれらのアノテーションへの参照しか実際に見ることができなかったという事実です。
私の質問は、アノテーション駆動型フレームワークがアノテーションをどのようにスキャンするかです。クラスローダーによってロードされる前に、スキャンしたいクラスを知ることはさらに困難です。私は、.class 拡張子で終わるすべてのファイルを探し、それらをロードして、注釈をチェックすることがアプローチであると考えていました。ただし、このアプローチはかなり厄介に聞こえます。
したがって、要約すると次のようになります。
- Tomcat はどのように注釈付きクラスを見つけますか? (または使い慣れた他のフレームワーク)
- Tomcat (または上記のフレームワーク) のアプローチがうまくいかない場合、どのようにしますか?
- これを全体的に設計するためのより良い方法はありますか?
注:カスタム アノテーションを使用してクラスのクラスパスをスキャンすることは素晴らしいことですが、可能であれば標準の Java 7 で実行したいと考えています。
更新: 反射は適切ではありません。大量の依存関係があり、さらに悪いことに、古いバージョンのライブラリに依存しています。特に、リリースごとに数十の機能を非推奨にし、迅速にリリースすることに誇りを持っているライブラリです。
このガイドに従って、可能であれば ASM を使用することを考えています: http://bill.burkecentral.com/2008/01/14/scanning-java-annotations-at-runtime/