articles:find_annotated_classes

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

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

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

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

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

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

reflectionsにもある例:

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

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

reflectionsを使用する。

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

  • 最終更新: 2020-03-07 14:30
  • by nabium