如何搜索带注释类的整个类路径?
我正在创建一个库,希望允许用户注释他们的类,因此当Web应用程序启动时,我需要扫描整个类路径以查找某些注释。
我正在考虑类似于Java EE 5 Web服务或EJB的新功能。你用@WebService或@EJB注释你的类,系统会在加载时找到这些类,这样就可以远程访问它们。
如何搜索带注释类的整个类路径?
我正在创建一个库,希望允许用户注释他们的类,因此当Web应用程序启动时,我需要扫描整个类路径以查找某些注释。
我正在考虑类似于Java EE 5 Web服务或EJB的新功能。你用@WebService或@EJB注释你的类,系统会在加载时找到这些类,这样就可以远程访问它们。
当前回答
谷歌反射,如果你也想发现接口。
Spring ClassPathScanningCandidateComponentProvider没有发现接口。
其他回答
Spring有一个AnnotatedTypeScanner类。 这个类内部使用
ClassPathScanningCandidateComponentProvider
该类具有实际扫描类路径资源的代码。它通过使用运行时可用的类元数据来实现这一点。
可以简单地扩展这个类或使用相同的类进行扫描。下面是构造函数定义。
/**
* 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;
}
谷歌反射,如果你也想发现接口。
Spring ClassPathScanningCandidateComponentProvider没有发现接口。
反射似乎比Spring快得多。找到了解决这一差异的特性请求:http://www.opensaga.org/jira/browse/OS-738
这就是为什么在开发过程中使用reflection作为应用程序的启动时间是非常重要的。对于我的用例来说,Reflections似乎也很容易使用(找到一个接口的所有实现者)。
在Spring中,您还可以使用AnnotationUtils类编写以下代码。例如:
Class<?> clazz = AnnotationUtils.findAnnotationDeclaringClass(Target.class, null);
要了解更多细节和所有不同的方法,请查看官方文档: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/annotation/AnnotationUtils.html
另一个解决方案是朗玛莫的倒影。
快速回顾一下:
如果您正在使用Spring,那么Spring解决方案是最好的选择。否则就是很大的依赖。 直接使用ASM有点麻烦。 直接使用Java Assist也很笨拙。 注释超轻,方便。还没有专家集成。 Reflections索引所有东西,而且非常快。