我有一个使用 Spring 构建并在 Jboss 中运行的 Web 应用程序。我正在尝试在运行时扫描具有特定注释的类。现在我正在使用开源反射库
public static List<Class> scanForClassesWithAnnotation(Class<? extends Annotation> annotationClass)
{
List<Class> classesWithAnnotation = new ArrayList<>();
for(Package p : Package.getPackages())
{
LOGGER.info("scanForClassesWithAnnotation: Examining package " + p.getName());
try
{
List<ClassLoader> classLoadersList = new ArrayList<>();
classLoadersList.add(ClasspathHelper.contextClassLoader());
classLoadersList.add(ClasspathHelper.staticClassLoader());
Reflections reflections = new Reflections(
new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false), new ResourcesScanner())
.setUrls(ClasspathHelper.forClassLoader(classLoadersList.toArray(new ClassLoader[classLoadersList.size()])))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(p.getName()))));
Set<Class<?>> classes = reflections.getSubTypesOf(Object.class);
LOGGER.info("\tscanForClassesWithAnnotation: found classes " + JsonUtils.objectToJson(classes));
for(Class foundClass : classes)
{
if(foundClass.isAnnotationPresent(annotationClass))
{
classesWithAnnotation.add(foundClass);
}
}
} catch (Exception ignored) {}
}
return classesWithAnnotation;
}
当这段代码执行时,我在日志中看到了许多这样的消息:
given scan urls are empty. set urls in the configuration
这段代码在一个独立的 Maven 项目中工作,所以我知道它通常可以工作。但我认为问题在于代码在 servlet 上下文中运行。我该如何解决?如何在 Spring webapp 中扫描带有注释的类?提前致谢。