我有一个用Spring构建并在Jboss内部运行的web应用程序。我正在尝试在运行时扫描具有特定注释的类。现在我使用的是开源的Reflections library
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中扫描带有注释的类?提前谢谢。
发布于 2014-06-05 05:56:34
开始玩吧
public class Scanner {
private static final Log log = LogFactory.getLog(Scanner.class);
public static void main(String[] args) throws IOException {
SimpleMetadataReaderFactory metadataFactory = new SimpleMetadataReaderFactory();
ResourcePatternResolver scaner = new PathMatchingResourcePatternResolver();
Resource[] resources = scaner.getResources("classpath*:/base.package/**/*.class");
for (Resource r : resources) {
log.info("Scanning [" + r.getDescription() + "]");
MetadataReader metadataReader = metadataFactory.getMetadataReader(r);
if (metadataReader.getAnnotationMetadata().isAnnotated("org.example.Annotation"))
log.info("found annotation in [" + r.getDescription() + "]");
}
}发布于 2014-06-05 06:09:03
这是可行的
public static List<Class> scanForClassesWithAnnotation2(Class<? extends Annotation> annotationClass)
{
List<Class> classesWithAnnotation = new ArrayList<>();
ClassPathScanningCandidateComponentProvider scanner =
new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(annotationClass));
for (BeanDefinition bd : scanner.findCandidateComponents("com.example"))
{
try
{
classesWithAnnotation.add(Class.forName(bd.getBeanClassName()));
} catch (ClassNotFoundException e)
{
LOGGER.error("Could not create class from class name");
}
}
return classesWithAnnotation;
}https://stackoverflow.com/questions/24047500
复制相似问题