如何在运行时加载从jar文件实现接口的类?

时间:2012-02-24 15:08:52

标签: java classloader dynamic-class-loaders

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

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

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

假设加载的jar文件同时包含AB类。我希望通过知道B接口名称来获取类iB中的实例。

我该怎么办?

1 个答案:

答案 0 :(得分:4)

查看此帖子: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