我想获得一个包中所有接口的列表,因此我不必手动更新新接口列表。所以我想如果有可能通过反射得到给定包中所有接口的列表。我知道可以在包中获取所有类,但我不知道如何使用接口来实现。
答案 0 :(得分:2)
如果您知道如何枚举包中的所有类,请先执行此操作,然后通过调用Class.isInterface()
过滤结果。
答案 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());
});