首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Reflections (或其他)扫描Spring Web App中的注释

如何使用Reflections (或其他)扫描Spring Web App中的注释
EN

Stack Overflow用户
提问于 2014-06-05 05:01:28
回答 2查看 742关注 0票数 0

我有一个用Spring构建并在Jboss内部运行的web应用程序。我正在尝试在运行时扫描具有特定注释的类。现在我使用的是开源的Reflections library

代码语言:javascript
复制
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;
}

当执行这段代码时,我在日志中看到许多这样的消息:

代码语言:javascript
复制
given scan urls are empty. set urls in the configuration

这段代码在一个独立的Maven项目中工作,所以我知道它通常可以工作。但我认为问题在于代码是在servlet上下文中运行的。我该如何解决这个问题?如何在Spring webapp中扫描带有注释的类?提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-06-05 05:56:34

开始玩吧

代码语言:javascript
复制
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() + "]");

        }
    }
票数 0
EN

Stack Overflow用户

发布于 2014-06-05 06:09:03

这是可行的

代码语言:javascript
复制
    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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24047500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档