在项目中,我需要在特定目录下加载不同的jar
文件。然后我将搜索实现特定.class
的{{1}}个文件。当我找到一个搜索时,我需要用interface
加载它。有一个简单的方法来做这一切吗?你能提出一些示例代码吗?
答案 0 :(得分:3)
看看ServiceLoader。这确实需要这些类的实现者在/META-INF/services/<fqn-of-interface>
中提供一个描述性文件,列出该接口的jar提供的所有实现类。
答案 1 :(得分:1)
我很确定你无法检查该类是否实现了特定的接口而没有先加载它。所以,我认为你必须加载每个类文件或尝试解决你的问题/以不同的方式实现你的目标。
您可以尝试读取.class文件二进制文件并在字节代码中找出它实现的接口,但不要问我如何执行此操作。 :)
答案 2 :(得分:1)
如果你在普通的Java应用程序中想要定义接口&lt; - &gt;,我也喜欢Mark的方法。实施先前的映射。
另外一种做我想做的事情就是修改类路径扫描,你可以考虑当前运行的类路径,并用它来按注释或接口查找组件。
这方面的热门示例是Spring。
要在Spring之外使用它,您可以尝试使用某些库,例如Reflections或Class-Search,它们提供API以在类路径中进行搜索。
由于我最近修改了Vaadin / GWT以及他们在当前类路径中查找内容的方法,如果你想手动实现类似的东西,那么他们的工具this class也会很有趣。
但是就像Martijn已经提到的那样,这些解决方案需要将JAR添加到类路径中,以便加载类,然后解释找到的组件。
如果这很重要且您无法预先加载课程并在以后解释它,您可以尝试在ASM之类的库之上构建一些可能提供.class
文件解释的文件。加载课程。