Java中列出特定类的所有子类

3
我如何列出特定类的所有子类或特定接口的所有实现类?我可以使用Eclipse来实现,但我想知道如何以编程方式执行此操作。如果您有任何建议,请分享。

你可以使用Java反射来实现此操作。 - N. berouain
@N.berouain。也许在某些非常狭窄的定义下,“所有”是成立的。 - Mad Physicist
2个回答

4

看一下reflection,它的基本用法:

Reflections reflections = new Reflections("com.package");    
Set<Class<? extends InterfaceExample>> classes = reflections.getSubTypesOf(InterfaceExample.class);

好的,但是使用反射,你能够扫描整个包或类路径吗? - user12705369
是的,这是可能的,像这样:Reflections reflections = new Reflections("com.package"); Set> allClasses = reflections.getSubTypesOf(Object.class); - N. berouain
但是反射在最新版本的Java中运行良好? - user12705369

0

依我看,这至少需要以下步骤:

  1. 对于当前的类加载器,迭代遍历类路径以获取文件夹和JAR列表(我只知道如何使用URLClassLoader及其子类型,即URLClassLoader.getURLs()
  2. 访问/读取列表中的每个文件夹或JAR,以了解其中的类并加载每个类(这里可能会有类加载器问题,但在大多数情况下可以解决)
  3. 反射并找出实现的接口(如果您正在寻找接口的子类)或超类(如果是类)。必须迭代执行此操作,直到达到java.lang.Object或目标接口或类。

如果父接口或类由它们加载(例如java.util.List),请为父类加载器重复上述步骤。

总之,请准备好进行内存和CPU密集型处理。 :)

Eclipse,我认为是逐步索引层次结构。这就是为什么大多数情况下它能快速显示结果的原因。虽然我不确定,但如果Eclipse提供一种通过插件实现在运行时访问其类型层次结构列表的方法,那么这可能值得探索。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接