如何扫描类注释?
我有一个简单的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/"
另外请确保您的课程标记为RetentionPolicy
为RUNTIME
@Retention(RetentionPolicy.RUNTIME)