是否可以获取java包中所有接口的列表?

时间:2012-09-30 07:57:09

标签: java reflection

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

3 个答案:

答案 0 :(得分:2)

如果您知道如何枚举包中的所有类,请先执行此操作,然后通过调用Class.isInterface()过滤结果。

参见als

答案 1 :(得分:1)

你可以(尝试)list all the classes in the package。然后,您可以检查每个类以查看它是否是the Class#isInterface() method的接口。

答案 2 :(得分:0)

我不知道确切地“手动更新新接口列表”是什么意思,但是如果您只想获取特定软件包中包含的所有接口的列表,而使用 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());
    });