代码之家  ›  专栏  ›  技术社区  ›  Ralph java.is.for.desktop

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

  •  1
  • Ralph java.is.for.desktop  · 技术社区  · 15 年前

    我的应用程序由几个jar文件组成。我想遍历所有的jar文件,找到所有类的子类,这样我就可以运行它们的静态初始化器。

    我查看了javadocs for java.lang.classloader,但找不到任何方法可以实现这一点。

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

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

    谢谢,拉尔夫

    3 回复  |  直到 15 年前
        1
  •  5
  •   Joachim Sauer    15 年前

    这通常是无法解决的。类加载器不需要能够遍历它可以加载的类。类加载器最简单的例子 不能 当您从 http:// 基本url:http没有提供标准化的方法来枚举任何给定url的内容。

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

        2
  •  0
  •   Riduidel    15 年前

    这显然不是很简单就能解决的。

    但是,也有解决办法,就像在这篇文章中提到的 Javaworld article

    一般来说,它包括从类路径探索所有元素。如果它们是jar文件,请浏览它们以查找类,加载这些类并查看它们是否扩展了引用基类。 不过,我强烈建议您使用更“成熟”的机制,比如ioc或插件架构。

    很明显我在想 JSPF ,作为一个例子。

        3
  •  0
  •   vickirk    15 年前

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

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

    [注意joachim sauer建议的serviceloader,或者提供类似机制的框架是更好的解决方案]