在jar中列出并加载类

时间:2012-04-15 09:51:25

标签: java jar classloader

在项目中,我需要在特定目录下加载不同的jar文件。然后我将搜索实现特定.class的{​​{1}}个文件。当我找到一个搜索时,我需要用interface加载它。有一个简单的方法来做这一切吗?你能提出一些示例代码吗?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

我很确定你无法检查该类是否实现了特定的接口而没有先加载它。所以,我认为你必须加载每个类文件或尝试解决你的问题/以不同的方式实现你的目标。

您可以尝试读取.class文件二进制文件并在字节代码中找出它实现的接口,但不要问我如何执行此操作。 :)

答案 2 :(得分:1)

如果你在普通的Java应用程序中想要定义接口&lt; - &gt;,我也喜欢Mark的方法。实施先前的映射。

另外一种做我想做的事情就是修改类路径扫描,你可以考虑当前运行的类路径,并用它来按注释或接口查找组件。

这方面的热门示例是Spring

要在Spring之外使用它,您可以尝试使用某些库,例如ReflectionsClass-Search,它们提供API以在类路径中进行搜索。

由于我最近修改了Vaadin / GWT以及他们在当前类路径中查找内容的方法,如果你想手动实现类似的东西,那么他们的工具this class也会很有趣。

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

如果这很重要且您无法预先加载课程并在以后解释它,您可以尝试在ASM之类的库之上构建一些可能提供.class文件解释的文件。加载课程。