你如何找到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