除了这里发布的问题:Can you find all classes in a package using reflection?,我开始使用Reflections库来查找所有子类化给定类型的类。从链接的SO问题的答案看,源代码如下所示:
Reflections ref = new Reflections(new ConfigurationBuilder()
.setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner())
.setUrls(ClasspathHelper.forPackage("org.somepackage"))
.filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix("org.somepackage"))));
ref.getSubtypesOf(Object.class);
但是,在明显使用了这段代码一段时间之后,我才发现它只会在该包中找到子类化另一种类型的类。它将找不到从外部定义的类继承的类,例如从另一个用户定义的包中继承。
我不确定如何使用Reflections库解决此问题。我希望所有将其程序包声明为“org.somepackage”的类,无论其父类(super class)型是什么。有什么帮助吗?
最佳答案
我编写了一个名为Rebound(与Reflections相反)的库,该库搜索给定类型和包前缀的子类。如果将前缀设置为空,它将搜索类路径下的每个类,例如
import gigadot.exp.reflects.core.Processor;
Rebound r = new Rebound("");
Set<Class<? extends Processor>> classes = r.getSubClassesOf(Processor.class);
但是您应该小心,因为在类路径中搜索所有内容都是一个缓慢的过程。
该库比Reflections简单得多,可能无法满足您的要求。由于我提交错误报告时感到沮丧,所以写了这篇文章,但是没有人试图解决这个问题。