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

一个人如何去尝试在Java中查找给定类(或给定接口的所有实现者)的所有子类? 到目前为止,我有一个方法来做到这一点,但我觉得效率很低(至少可以这么说)。 该方法是:

  • 获取类路径中存在的所有类名的列表
  • 加载每个类并测试它是否是所需类或接口的子类或实现者
  • 在Eclipse中,有一个称为类型层次结构的很好的功能,可以非常有效地显示这一点。 人们如何去编程地做呢?


    除了你所描述的之外,没有别的办法可以做到。 想一想 - 人们怎么能知道什么类扩展ClassX而不扫描类路径中的每个类?

    Eclipse只能告诉你有关超级和子类的“有效”时间量,因为它已经在按下“Display in Type Hierarchy”按钮时加载了所有类型数据(因为它是不断编译你的类,知道类路径上的所有内容等)。


    使用纯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
    }
    

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


    这不可能仅使用内置的Java反射API。

    存在一个项目,可以对您的类路径进行必要的扫描和索引,以便您可以访问此信息...

    思考

    本着Scannotations的精神进行Java运行时元数据分析

    反射会扫描您的类路径,索引元数据,允许您在运行时查询它,并可以为项目中的许多模块保存和收集该信息。

    使用反射,您可以查询您的元数据:

  • 获取某种类型的所有子类型
  • 使用某些注释获取所有类型的注释
  • 使用某些注释获取所有类型的注释,包括注释参数匹配
  • 获取所有用一些注解的方法
  • (免责声明:我没有使用它,但该项目的描述似乎完全适合您的需求。)

    链接地址: http://www.djcxy.com/p/61841.html

    上一篇: How do you find all subclasses of a given class in Java?

    下一篇: Spring security redirecting to login page for authenticated urls