3

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/

4

1 に答える 1

2

Tomcat は、Apache Commons BCEL のカットダウン バージョン (Tomcat が必要とするビットのみが存在するように) とパッケージの名前が変更されたバージョン (Web アプリに BCEL が同梱されていても衝突しないようにするため) を使用して注釈をスキャンします。すべての .class ファイルを探し、バイト コードを読み取り、注釈を抽出します。

詳細については、ソース コードを参照してください。このファイルの 1130 行目から開始します: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/startup/ContextConfig.java?annotate=1537835

この種のことを行うための他の一般的なライブラリは ASM です。

于 2013-11-10T18:21:56.980 に答える