如何枚举Java中超类的所有子类

时间:2010-02-17 12:53:11

标签: java classloader

我的应用程序包含多个JAR文件。我想遍历所有JAR文件并找到子类化特定类的所有类,以便我可以使它们的静态初始化器运行。

我查看了java.lang.ClassLoader的Javadocs,但找不到任何执行此操作的方法。

我正在尝试实现“Product Trader”模式(http://www.ubilab.com/publications/print_versions/pdf/plop-96-producttrader.pdf),在抽象超类中使用“自注册”类。超类将有一个HashMap,它映射子类提供的服务和处理该服务的java.lang.Class文件。

问题是类在加载之前不会运行它的静态初始值设定项。如果我可以迭代所有子类,我可以强制每个子类加载并运行它的初始化器。

谢谢,拉尔夫

3 个答案:

答案 0 :(得分:5)

这通常无法解决。 ClassLoader不需要能够迭代它可以加载的类。从<{1}}基本URL加载类时,不能执行此操作的ClassLoader的最简单示例:HTTP没有提供标准化方法来枚举任何给定URL的内容。

更好的实现方法是使用ServiceLoader并让所有实现类通过jar文件中的简单条目注册自己。

答案 1 :(得分:0)

如果你真的需要这样做,唯一真正的方法是遍历类路径,扫描jar文件的jar和目录,加载该类并查看它的父类。

注意,某些类将具有可能具有不良副作用的静态初始化代码,例如:从运行时加载X11类可能会挂很长时间。如果可能,请尝试限制您加载到特定包的类,例如com.company(您当然可以通过类文件的路径相对于类路径项的根来识别包。)

[注意Joachim Sauer建议的ServiceLoader,或提供类似机制的框架是一个更好的解决方案]

答案 2 :(得分:0)

这显然不能简单解决。

但是,有一些解决方案,例如Javaworld article中提到的解决方案。

一般来说,它包含探索CLASSPATH中的所有元素。如果它们是jar文件,请探索它们寻找类,加载这些类并查看它们是否扩展了引用基类。 但是,我强烈建议您使用更加“成熟”的机制,如IoC或插件架构。

我显然正在考虑JSPF,作为一个例子。

相关问题