首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中找到给定类的所有子类?

如何在Java中找到给定类的所有子类?
EN

Stack Overflow用户
提问于 2009-01-29 15:53:03
回答 17查看 149.6K关注 0票数 222

如何在Java中找到给定类(或给定接口的所有实现者)的所有子类?到目前为止,我有一种方法可以做到这一点,但我发现它的效率相当低(至少可以说)。方法是:

  1. 获取类路径上存在的所有类名的列表
  2. 加载每个类并进行测试,以查看它是否是所需类或接口的子类或实现者

在Eclipse中,有一个很好的特性,称为类型层次结构,它可以非常有效地显示这一点。如何以编程的方式去做呢?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2009-01-29 15:58:52

除了你所描述的之外,没有其他方法可以做到这一点。想想看--如果不扫描类路径上的每个类,怎么知道哪些类扩展了ClassX?

Eclipse只能在看似“有效”的时间内告诉您有关超类和子类的信息,因为在您按下“在类型层次结构中显示”按钮时,它已经加载了所有类型数据(因为它不断地编译您的类,知道类路径上的所有内容,等等)。

票数 81
EN

Stack Overflow用户

发布于 2009-01-30 15:13:56

使用纯Java扫描类并不容易。

spring框架提供了一个名为ClassPathScanningCandidateComponentProvider的类,它可以执行您需要的操作。下面的示例将在org.example.package包中查找MyClass的所有子类

代码语言:javascript
复制
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(false);
provider.addIncludeFilter(new AssignableTypeFilter(MyClass.class));

// scan in org.example.package
Set<BeanDefinition> components = provider.findCandidateComponents("org/example/package");
for (BeanDefinition component : components)
{
    Class cls = Class.forName(component.getBeanClassName());
    // use class cls found
}

这种方法还有一个额外的好处,那就是使用字节码分析器来查找候选类,这意味着它不会加载它扫描的所有类。

票数 138
EN

Stack Overflow用户

发布于 2015-09-24 22:55:53

试试ClassGraph。(免责声明,我是作者)。ClassGraph支持在运行时或构建时扫描给定类的子类,而且还支持更多扫描。ClassGraph可以在内存中为类路径上的所有类或所选包中的类构建整个类图(所有类、注释、方法、方法参数和字段)的抽象表示,并且您可以根据需要查询此类图。ClassGraph比任何其他扫描器都支持more classpath specification mechanisms and classloaders,并且还可以与新的JPMS模块系统无缝地工作,所以如果您的代码基于ClassGraph,那么您的代码将具有最大的可移植性。See the API here.

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/492184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档