web-dev-qa-db-ja.com

クラスの注釈をスキャンする方法は?

プレーンジェーンサーブレットWebアプリケーションがあり、一部のクラスには次のアノテーションがあります。

@Controller
@RequestMapping(name = "/blog/")
public class TestController {
..

}

次に、サーブレットアプリケーションが起動したときに、@ Controllerアノテーションが付いているすべてのクラスのリストを取得し、次に@RequestMappingアノテーションの値を取得して辞書に挿入します。

これどうやってするの?

私はGuiceとGuavaも使用していますが、注釈に関連するヘルパーがあるかどうかはわかりません。

17
loyalflow

Reflections library を使用するには、探しているパッケージと注釈を指定します。

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

for (Class<?> controller : annotated) {
    RequestMapping request = controller.getAnnotation(RequestMapping.class);
    String mapping = request.name();
}

もちろん、すべてのサーブレットを同じパッケージに配置すると、これが少し簡単になります。また、代わりにRequestMappingアノテーションが付いているクラスを探すこともできます。これは、値を取得しようとしているクラスだからです。

38
Jacob Schoen

注釈のスキャンは非常に困難です。実際には、すべてのクラスパスの場所を処理し、Javaクラス(* .class)に対応するファイルを検索する必要があります。

そのような機能を提供するフレームワークを使用することを強くお勧めします。たとえば、 Scannotation を確認できます。

5
chkal

Springを使用している場合、

AnnotatedTypeScannerクラスと呼ばれるものがあります。
このクラスは内部で使用します

ClassPathScanningCandidateComponentProvider

このクラスには、classpathリソースを実際にスキャンするためのコードがあります。これは、実行時に使用可能なクラスメタデータを使用して行われます。

このクラスを拡張するか、同じクラスをスキャンに使用できます。以下はコンストラクタの定義です。

   /**
     * Creates a new {@link AnnotatedTypeScanner} for the given annotation types.
     * 
     * @param considerInterfaces whether to consider interfaces as well.
     * @param annotationTypes the annotations to scan for.
     */
    public AnnotatedTypeScanner(boolean considerInterfaces, Class<? extends Annotation>... annotationTypes) {

        this.annotationTypess = Arrays.asList(annotationTypes);
        this.considerInterfaces = considerInterfaces;
    }
3
swayamraina

Corn-cpsを試す

List<Class<?>> classes = CPScanner.scanClasses(new PackageNameFilter("net.sf.corn.cps.*"),new ClassFilter().appendAnnotation(Controller.class));
for(Class<?> clazz: classes){
   if(clazz.isAnnotationPresent(RequestMapping.class){
     //This is what you want
   }
}

Mavenモジュールの依存関係:

<dependency>
    <groupId>net.sf.corn</groupId>
    <artifactId>corn-cps</artifactId>
    <version>1.0.1</version>
</dependency>

詳細については、サイト https://sites.google.com/site/javacornproject/corn-cps にアクセスしてください

2
Serhat