目次

アノテーションされたクラスを検索する

特定のアノテーションでアノテートされたクラスを検索する方法。

Java APIだけでは困難

クラスが事前にわかる場合は、Class::getDeclaredAnnotation()Class::getDeclaredAnnotationsByType()でアノテーションされているかどうか判別できる。

しかし、クラスが事前にわからないとダメで、アノテーションからクラスを見つけることは出来ない。

まずはクラスの一覧を取得しなくてはならないが、Java APIにはロード可能なクラスの一覧を取得する機能はない。 クラスパスを元にクラスファイルやjarを検索してクラスを見つけていく必要がある。

reflections

自前で実装するのは大変なので、reflectionsを使用する。

reflectionsにもある例:

Reflections reflections = new Reflections("my.project");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(SomeAnnotation.class);

アノテートされたクラスだけでなくメソッドやフィールドの検索、特定のインタフェースを実装したクラスの検索にも使える。

結論

reflectionsを使用する。

しかし、動的にwarやjarを読み込むサーブレットコンテナやOSGiコンテナを使用している場合は、動的にクラスパスが変わるので工夫が必要になるはず。 JavaのAPIで提供されていないのはなぜかと考えると汎用的に使える手法ではなさそう。 サンプル等限定された環境での使用にとどめた方が良い。