1

I would like to get a list of all interfaces in one package, so I wouldn't have to manually update the list of new interfaces. So I thought if it might be possible to get list of all interfaces in given package via reflection. I know that it is possible to get all classes in package, but I don't know how can I do that with interfaces.

Rndm
  • 6,710
  • 7
  • 39
  • 58
newbie
  • 24,286
  • 80
  • 201
  • 301
  • Um, `grep -w interface path/to/package/*.java`? Also, how do you get a list of all classes in a package? The best you can do is list all classes in an package that happen to be packaged in a .jar file, or all that happen to be in a particular (readable) folder. – Ted Hopp Sep 30 '12 at 08:02
  • Might be a dupe of http://stackoverflow.com/questions/3273157/is-it-possible-to-get-a-collection-of-public-interfaces-and-classes-in-a-package?rq=1 –  Sep 30 '12 at 08:02

3 Answers3

2

If you know how to enumerate all classes in a package, just do it first and then filter the results by calling Class.isInterface().

See als

Community
  • 1
  • 1
Tomasz Nurkiewicz
  • 334,321
  • 69
  • 703
  • 674
1

You can (try to) list all the classes in the package. You can then check each class to see if it is an interface with the Class#isInterface() method.

Community
  • 1
  • 1
assylias
  • 321,522
  • 82
  • 660
  • 783
1

I don't know what you mean with 'manually update the list of new interfaces' exactly, but if you want to simply get a list of all interfaces contained in a specific package and you use spring you could do the following:

    // 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());
    });
Matthias
  • 400
  • 1
  • 4
  • 13