搜索带注释类的整个类路径的最佳方法是什么?
我正在做一个库,我想允许用户注释他们的类,所以当Web应用程序启动时,我需要扫描整个类路径以获取某些注释.
你知道一个库或Java工具吗?
编辑:我正在考虑类似Java EE 5 Web服务或EJB的新功能.您使用@WebService
or 注释您的类,@EJB
并且系统在加载时查找这些类,以便远程访问它们.
使用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider
API
从基础包扫描类路径的组件提供程序.然后,它会对结果类应用排除和包含过滤器以查找候选项.
ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(); scanner.addIncludeFilter(new AnnotationTypeFilter( .class)); for (BeanDefinition bd : scanner.findCandidateComponents( )) System.out.println(bd.getBeanClassName());
另一个解决方案是谷歌的反思.
快速复审:
如果你使用Spring,Spring解决方案就是你的选择.否则这是一个很大的依赖.
直接使用ASM有点麻烦.
直接使用Java Assist也很笨拙.
Annovention超轻便,方便.还没有maven集成.
谷歌的反思吸引了谷歌的收藏.索引一切然后超快.
您可以使用ClassGraph查找具有任何给定注释的类,以及搜索其他感兴趣的标准,例如实现给定接口的类.(免责声明,我是ClassGraph的作者.)ClassGraph可以在内存中为类路径上的所有类或类中的类构建整个类图(所有类,注释,方法,方法参数和字段)的抽象表示.列入白名单的软件包,您可以根据需要查询该类图.ClassGraph支持比任何其他扫描程序更多的类路径规范机制和类加载器,并且还可以与新的JPMS模块系统无缝协作,因此如果您将代码基于ClassGraph,您的代码将最大程度地可移植.请在此处查看API.
如果你想要一个真正重量轻(无依赖性,简单的API,15 kb的jar文件)和非常快的解决方案,来看看annotation-detector
在发现https://github.com/rmuller/infomas-asl
免责声明:我是作者.
您可以使用Java Pluggable Annotation Processing API编写将在编译过程中执行的注释处理器,并将收集所有带注释的类并构建索引文件以供运行时使用.
这是进行带注释的类发现的最快方法,因为您不需要在运行时扫描类路径,这通常是非常慢的操作.此方法也适用于任何类加载器,而不仅适用于运行时扫描程序通常支持的URLClassLoaders.
上述机制已在ClassIndex库中实现.
要使用它,请使用@IndexAnnotated元注释来注释自定义注释.这将在编译时创建一个索引文件:META-INF/annotations/com/test/YourCustomAnnotation列出所有带注释的类.您可以通过执行以下命令在运行时访问索引:
ClassIndex.getAnnotated(com.test.YourCustomAnnotation.class)
尝试Scannotation.
它可用于搜索类路径或Web应用程序lib目录以获取特定注释.
您可能想要使用http://code.google.com/p/annovention/