Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有可能得到一个类的所有子类吗?_Java_Reflection_Runtime - Fatal编程技术网

Java 有可能得到一个类的所有子类吗?

Java 有可能得到一个类的所有子类吗?,java,reflection,runtime,Java,Reflection,Runtime,可能重复: 嗨 我想得到一个在运行时用Java实现接口的类列表,这样我就可以在不必硬编码的情况下执行查找服务。有没有一个简单的方法可以做到这一点?恐怕不行。简短的回答是否定的 很长的答案是子类可以以多种方式存在,这基本上不可能完全找到它们 您无法在运行时执行此操作,但在类被加载之前您无法找到它们,您如何知道它们已被加载?您可以扫描每个JAR和类文件,但这不是确定的。另外还有URL类加载器之类的东西 内部类(静态和非静态)是另一个需要考虑的情况。命名的内部类更容易找到。匿名内部类可能更难找到 你

可能重复:


我想得到一个在运行时用Java实现接口的类列表,这样我就可以在不必硬编码的情况下执行查找服务。有没有一个简单的方法可以做到这一点?恐怕不行。

简短的回答是否定的

很长的答案是子类可以以多种方式存在,这基本上不可能完全找到它们

您无法在运行时执行此操作,但在类被加载之前您无法找到它们,您如何知道它们已被加载?您可以扫描每个JAR和类文件,但这不是确定的。另外还有URL类加载器之类的东西

内部类(静态和非静态)是另一个需要考虑的情况。命名的内部类更容易找到。匿名内部类可能更难找到


你还必须考虑,如果一个类有子类,那么在稍后的时间点可以创建新的子类。

< P>如果你只从磁盘或URL加载类,那么你可以扫描类路径并找到“手动”的子类。

< P>我试图通过这里的答案来推理,所以我可能错了。类拥有关于其子类或子类的信息是没有意义的,因为在任何时候都有人可以创建类的新子类。然后,每次都必须重新编译类以包含这些新信息。这对于可扩展代码没有意义。类更可能包含有关其祖先的信息。所以我能看到的唯一解决方案是迭代问题空间中的每个类并进行检查,但这很可能是一个可怕的解决方案

我总是可以为任何非final类创建一个新的子类,将该子类添加到类路径中,并挫败您的意图。子类化是一个开放的命题


对于给定的类路径,最好的方法是知道子类是什么,要做到这一点,必须扫描类路径中的每个类。

使用反射非常简单。阅读来自JavaWorld的这篇文章


唯一的方法是遍历类路径中可用包的包层次结构,通过反射检查每个类(这很糟糕,因为你将有效地加载每个类,除非你将搜索限制在某些包上)


这种自动魔法行为的问题在于,如果不运行应用程序,就很难对其进行量化,这是一个维护难题。我总是更喜欢通过某种配置传递实例的注入路径(a-la-Spring)。

您想枚举实现特定接口的类,还是枚举派生自某个基类的类?这是两个不同的问题。据我所知,这两者都很难实现,因为将来任何时候都可以在PC上创建/安装新的实现。听起来您正试图创建一个工厂方法来实例化一个特定的实例,并且不想在代码中硬编码类名。通常,使用枚举实现接口的所有类的配置文件是一种方法(或者可以使用数据库)。当新类实现接口时,您可以将它们添加到配置文件中,工厂应该选择新的类名。

您应该使用内置类的Java。它能够在运行时对所有已知的服务(接口)实现进行迭代


如果出于某种原因您不想要它,您可以使用ClassLoader.getSystemResources()来迭代所有资源;e、 如果你有6倍于/META-INF/com.interface的文件,你将得到6次迭代

在C#中,您可以通过迭代程序集中每个类的定义,并测试这些类中的每个类,以查看它是否实现了该接口来实现这一点。遗憾的是,问题不在于C#。重复?“如何在Java中找到给定类的所有子类?’,这个问题更倾向于服务加载器模式?您也可以参考另一篇旧文章了解更多细节,我相信这对您很有用:)我误解了这个问题,上面的文章只是为了找到实现给定接口的子类。该代码只扫描特定的包。但是子类可以存在于任何包中。在文章中,它说“我们对实现给定接口的所有类都感兴趣。通过Java反射,没有这样的信息可用”。