21

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

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

}

サーブレット アプリケーションが起動したら、@Controller アノテーションを持つすべてのクラスのリストを取得し、@RequestMapping アノテーションの値を取得してディクショナリに挿入したいと考えています。

これどうやってするの?

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

4

7 に答える 7

41

探しているパッケージと注釈を指定することで、 Reflections ライブラリを使用できます。

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また、代わりにアノテーションを持つクラスを探したい場合もあります。これは、値を取得しようとしているクラスだからです。

于 2012-10-29T20:10:07.723 に答える
5

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

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

于 2012-10-29T19:55:06.833 に答える
2

コーン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をご覧ください。

于 2013-05-19T21:41:13.127 に答える
-3

.class ファイルにアクセスできる場合は、以下のようにクラスを使用して注釈を取得できます。

  RequestMapping reqMapping =  
                         TestController.class.getAnnotation(RequestMapping.class);
  String name = reqMapping.name(); //now name shoud have value as "/blog/"

RetentionPolicyまた、クラスが次のようにマークされていることを確認してくださいRUNTIME

  @Retention(RetentionPolicy.RUNTIME)
于 2012-10-29T20:04:51.823 に答える