1

我想获得一个包中所有接口的列表,因此我不必手动更新新接口列表。所以我想是否有可能通过反射获取给定包中所有接口的列表。我知道可以在包中获取所有类,但我不知道如何使用接口来做到这一点。

4

3 回答 3

2

如果您知道如何枚举一个包中的所有类,只需先这样做,然后通过调用Class.isInterface().

另见

于 2012-09-30T08:04:26.683 回答
1

您可以(尝试)列出包中的所有类。然后,您可以检查每个类以查看它是否是Class#isInterface()方法的接口。

于 2012-09-30T08:04:40.410 回答
1

我不知道“手动更新新接口列表”的确切含义,但是如果您只想获取特定包中包含的所有接口的列表并且使用spring,则可以执行以下操作:

    // Instantiate new ClassPathScanner, usualy used to get classes annotated with @Service, @Component.
    // The false paramater is provided to disable these default filters.
    // Since the ClassPathScanningCandidateComponentProvider only scanns for toplevel classes we 
    // override the default isCandidateComponent Method to return Interfaces instead.
    ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false) {
        @Override
        protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
            return beanDefinition.getMetadata().isInterface();
        }
    };

    // Filter to include only classes that have a particular annotation.
    // Since we disables the default filters we have to provide this one.
    // Here we can provide any regex we want, in this case we fillter all provided classes / interfaces.
    provider.addIncludeFilter(new RegexPatternTypeFilter(Pattern.compile(".*")));

    // define package to scan.
    Set<BeanDefinition> beans = provider.findCandidateComponents("compu.global.hyper.mega.net");

    beans.forEach(bd -> {
        System.out.println(bd.getBeanClassName());
    });
于 2018-07-26T13:01:14.027 回答