【问题标题】:How to load a class which implements a interface from a jar file at runtime?如何在运行时从 jar 文件中加载实现接口的类?
【发布时间】:2012-02-24 23:15:56
【问题描述】:

我想实现一个可以使用用户实现的类的应用程序。每个类都应该实现一个我定义接口的接口,最后,所有由用户实现的类,归档在一个 jar 文件中。用户将 jar 文件复制到类路径中,然后只将 jar 文件名提供给我的应用程序。我的应用程序应该能够动态加载 jar 文件。为此,我发现this post 非常有用,但它通过类名加载类。我想根据他们的父母加载课程。

public class A implements iA {
    @Override
    int getAValue() { ... }
}

public class B implements iB {
     @Override
     int getBValue() { ... }
}

假设加载的 jar 文件同时具有 AB 类。我想通过知道iB 接口名称从类B 中获取一个实例。

我该怎么办?

【问题讨论】:

    标签: java classloader dynamic-class-loaders


    【解决方案1】:

    查看此帖子:Find Java classes implementing an interface

    它谈到了你想要的解决方案。

    我知道我要建议的不是最简单的方法,但您刚刚描述了 Java 插件架构的基本用例之一和 OSGi 的成功故事。

    我建议使用 Apache Felix 之类的轻量级工具,让用户提供的 jar 实现一个简单的 osgi.BundleActivator 并将您的接口的实现注册为 OSGi 服务。 (这只是一个花哨的哈希映射,与 REST 服务等无关)。

    然后您可以获取给定接口的所有实现。它非常简单。您可以在此处查看 Felix 文档:http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html

    【讨论】:

    • 也喜欢osgi,刚入手osgi很痛苦,但值得。我认为您也应该提到 felix 的自动部署选项,它会更适合他的情况。
    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 2012-06-16
    • 2011-04-12
    • 2019-03-18
    • 2011-11-26
    • 1970-01-01
    • 2014-07-30
    • 2012-10-20
    相关资源
    最近更新 更多