除了这里发布的问题: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简单得多,可能无法满足您的要求。由于我提交错误报告时感到沮丧,所以写了这篇文章,但是没有人试图解决这个问题。

10-06 06:51