如何扫描类注释?

我有一个简单的jane servlets Web应用程序,我的一些类有以下注释:

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

现在,当我的servlet应用程序启动时,我想获得所有具有@Controller注释的类的列表,然后获取@RequestMapping注释的值并将其插入字典中。

我怎样才能做到这一点?

我也使用Guice和Guava,但不确定是否有任何与注释相关的助手。

您可以使用Reflections库 ,为其提供您要查找的包和注释。

 Reflections reflections = new Reflections("my.project.prefix"); Set> annotated = reflections.getTypesAnnotatedWith(Controller.class); for (Class controller : annotated) { RequestMapping request = controller.getAnnotation(RequestMapping.class); String mapping = request.name(); } 

当然,将所有servlet放在同一个包中会使这更容易一些。 此外,您可能希望查找具有RequestMapping注释的类,因为这是您要从中获取值的类。

扫描注释非常困难。 实际上,您必须处理所有类路径位置,并尝试查找与Java类(* .class)对应的文件。

我强烈建议使用提供此类function的框架。 例如,您可以查看Scannotation 。

尝试玉米cps

 List> 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模块依赖:

  net.sf.corn corn-cps 1.0.1  

有关详细信息,请访问网站https://sites.google.com/site/javacornproject/corn-cps

如果您可以访问.class文件,那么您可以使用如下所示的类获取注释:

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

另外请确保您的课程标记为RetentionPolicyRUNTIME

  @Retention(RetentionPolicy.RUNTIME)