2012-04-15 43 views
0

在一个项目中,我需要在特定的目录下加载不同的jar文件。然后我将搜索.class文件,这些文件实现了特定的interface。当我发现搜索一个,我需要加载它与Class.forName()。有没有简单的方法来做到这一点?你能提出一些示例代码吗?jar中的列表和加载类

回答

1

如果您在一个普通的Java应用程序中并且想要定义接口< - > Implementation(s)映射,我也喜欢Mark的方法。

做你想做的事情的另一种方法我认为是修补类路径扫描,你考虑当前正在运行的类路径并使用它通过注释或接口查找组件。

这方面的流行示例例如Spring

要在Spring以外使用,你可以尝试使用一些库,如ReflectionsClass-Search,它们提供了一个在类路径中搜索的API。

由于我最近用Vaadin/GWT和他们的方法来找到当前类路径中的某些东西,this class从他们的工具可能对你很有趣,如果你想手动实现类似的东西。

但是就像Martijn已经提到的那样,这些解决方案需要将JAR添加到类路径中,以便类加载并解析找到的组件。

如果这很关键,你不能先加载并解释它,那么你可以尝试在类库之上构建一些东西,比如ASM,它可能会提供对.class文件的解释而不加载类。

1

我敢肯定,你不能检查类是否实现了一个特定的接口,而无需首先加载它。所以,我认为你必须加载每个班级文件或尝试解决你的问题/以不同的方式实现你的目标。

您可以尝试读取.class文件二进制文件,并在字节代码中找到它实现的接口,但不要问我该怎么做。 :)

+0

是的,你是对的。我的实际问题是找到完整的类名(带有包),因为Class.forName()期待全名。事先我不知道jar中的类名。 – cacert 2012-04-15 09:58:03

3

看看ServiceLoader。这确实要求这些类的实现者在/META-INF/services/<fqn-of-interface>中提供一个描述性文件,其中列出了该接口的jar提供的所有实现类。

+0

它似乎可以补救我的问题。我会谷歌一些示例代码。谢谢。 – cacert 2012-04-15 10:12:46