当前位置: 首页 > 面试题库 >

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

夏和雅
2023-03-14
问题内容

如何去尝试找到Java中给定类的所有子类(或给定接口的所有实现者)?到目前为止,我有一种方法可以执行此操作,但是我发现它效率很低(至少可以这样说)。方法是:

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

在Eclipse中,有一个很好的功能,称为类型层次结构(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
}

此方法的另一个好处是使用字节码分析器查找候选对象,这意味着它不会加载它扫描的所有类。



 类似资料:
  • 问题内容: 我需要一种工作方法来获取所有从Python基类继承的类。 问题答案: 新型类(即objectPython中默认的from的子类)具有一种返回子类的方法: 这是子类的名称: 这是子类本身: 确认确实将子类Foo列为其基础: 请注意,如果需要子类,则必须递归: 请注意,如果尚未执行子类的类定义(例如,如果尚未导入子类的模块),则该子类尚不存在,也将找不到它。 你提到“给定名称”。由于Pyt

  • 我有一个多构建Java项目正在用Gradle构建。 为了隐藏非法反射访问警告,我想在几个项目中找到JavaExec和Test任务,并提供所需的JVM参数。而不是将这些添加到每个项目中,我想将其应用于根中的所有项目build.gradle. 如何在所有项目中找到特定类型的特定任务? 我最初尝试使用withType,但是我想消除重复JavaExec和Test任务类型。见下文: 尝试#1

  • 问题内容: 我需要获取所有调用者方法的列表,以获取Java感兴趣的方法。有什么工具可以帮助我吗? 编辑:我忘了提到我需要从程序中执行此操作。我使用的是Java Pathfinder,我想将其作为调用我感兴趣的方法的所有方法来运行。 问题答案: 为了分析字节码,我建议使用ASM。给定要分析的类列表,可以使访问者找到您感兴趣的方法调用。下面是一个分析jar文件中类的实现。 请注意,ASM使用带有’/’

  • 问题内容: 下载JDK / JRE时,我需要知道该类属于哪个JAR。有什么方法可以使用Eclipse或任何其他工具搜索特定类所属的Jar。现在,我必须打开jar 并仔细检查每个jar,以查看是否正在查找我正在搜索的课程。 问题答案: 您可以从在JarFinder上搜索类开始。 http://www.findjar.com/ 有时一门课程不只一次JAR,因此并不完美。但这可能有助于缩小搜索范围。 如

  • 问题内容: 给定一个类名作为字符串,如何在运行时获取它的包名?我没有带有包名+类名的完全限定名称。仅是类名。 我想在方法中使用包名。 找到第一个匹配的软件包名称(如果多个软件包具有相同的类),就可以了。 有任何想法吗? 更新 我没有要处理的Class实例。我的要求是使用该方法创建一个Class 。但是我只是将类名作为字符串。我需要某种方法来遍历软件包并确定我所拥有的类是否属于该软件包。 异常的堆栈

  • 问题内容: 在我正在研究的基于Linux的项目中,我需要能够找到我的所有子进程。每次启动时都进行记录是不可行的-需要在事实之后找到它们。这必须是纯C语言,而我想不读取/ proc就这样做。有谁知道如何做到这一点? 问题答案: 我发现您的评论认为,将进程的创建记录为奇数是不可行的,但是如果您真的做不到(可能是因为您不知道将创建多少个进程,并且不想保留内存) ),那么我可能会打开所有与该glob匹配的