0

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

4

3 回答 3

3

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

于 2012-04-15T10:00:26.347 回答
1

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

您可以尝试读取 .class 文件二进制文件并在字节码中找出它实现了哪个接口,但不要问我如何做到这一点。:)

于 2012-04-15T09:54:04.947 回答
1

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

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

流行的例子是Spring

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

由于我最近修改了 Vaadin/GWT 以及他们在当前类路径中查找内容的方法,因此如果您想手动实现类似的东西,他们工具中的这个类对您来说也可能很有趣。

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

如果这很关键,并且您无法预先加载类并稍后对其进行解释,则可以尝试在ASM之类的库之上构建一些东西,它可能可以在不加载类的情况下提供.class-file 的解释。

于 2012-04-15T18:21:10.160 回答