如何在Java中找到给定类(或给定接口的所有实现者)的所有子类?到目前为止,我有一种方法可以做到这一点,但我发现它的效率相当低(至少可以说)。方法是:
在Eclipse中,有一个很好的特性,称为类型层次结构,它可以非常有效地显示这一点。如何以编程的方式去做呢?
发布于 2009-01-29 15:58:52
除了你所描述的之外,没有其他方法可以做到这一点。想想看--如果不扫描类路径上的每个类,怎么知道哪些类扩展了ClassX?
Eclipse只能在看似“有效”的时间内告诉您有关超类和子类的信息,因为在您按下“在类型层次结构中显示”按钮时,它已经加载了所有类型数据(因为它不断地编译您的类,知道类路径上的所有内容,等等)。
发布于 2009-01-30 15:13:56
使用纯Java扫描类并不容易。
spring框架提供了一个名为ClassPathScanningCandidateComponentProvider的类,它可以执行您需要的操作。下面的示例将在org.example.package包中查找MyClass的所有子类
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
}
这种方法还有一个额外的好处,那就是使用字节码分析器来查找候选类,这意味着它不会加载它扫描的所有类。
发布于 2015-09-24 22:55:53
试试ClassGraph。(免责声明,我是作者)。ClassGraph支持在运行时或构建时扫描给定类的子类,而且还支持更多扫描。ClassGraph可以在内存中为类路径上的所有类或所选包中的类构建整个类图(所有类、注释、方法、方法参数和字段)的抽象表示,并且您可以根据需要查询此类图。ClassGraph比任何其他扫描器都支持more classpath specification mechanisms and classloaders,并且还可以与新的JPMS模块系统无缝地工作,所以如果您的代码基于ClassGraph,那么您的代码将具有最大的可移植性。See the API here.
https://stackoverflow.com/questions/492184
复制相似问题