在一个项目中,我需要在特定的目录下加载不同的jar
文件。然后我将搜索.class
文件,这些文件实现了特定的interface
。当我发现搜索一个,我需要加载它与Class.forName()
。有没有简单的方法来做到这一点?你能提出一些示例代码吗?jar中的列表和加载类
回答
如果您在一个普通的Java应用程序中并且想要定义接口< - > Implementation(s)映射,我也喜欢Mark的方法。
做你想做的事情的另一种方法我认为是修补类路径扫描,你考虑当前正在运行的类路径并使用它通过注释或接口查找组件。
这方面的流行示例例如Spring。
要在Spring以外使用,你可以尝试使用一些库,如Reflections或Class-Search,它们提供了一个在类路径中搜索的API。
由于我最近用Vaadin/GWT和他们的方法来找到当前类路径中的某些东西,this class从他们的工具可能对你很有趣,如果你想手动实现类似的东西。
但是就像Martijn已经提到的那样,这些解决方案需要将JAR添加到类路径中,以便类加载并解析找到的组件。
如果这很关键,你不能先加载并解释它,那么你可以尝试在类库之上构建一些东西,比如ASM,它可能会提供对.class
文件的解释而不加载类。
我敢肯定,你不能检查类是否实现了一个特定的接口,而无需首先加载它。所以,我认为你必须加载每个班级文件或尝试解决你的问题/以不同的方式实现你的目标。
您可以尝试读取.class文件二进制文件,并在字节代码中找到它实现的接口,但不要问我该怎么做。 :)
看看ServiceLoader。这确实要求这些类的实现者在/META-INF/services/<fqn-of-interface>
中提供一个描述性文件,其中列出了该接口的jar提供的所有实现类。
它似乎可以补救我的问题。我会谷歌一些示例代码。谢谢。 – cacert 2012-04-15 10:12:46
- 1. 加载类的列表
- 2. 如何从Jar加载类?
- 3. 在Jar文件中加载类
- 4. 无法在jar文件中加载类
- 5. 在C#中提取JAR类的列表#
- 6. 无法加载jar文件的主类
- 7. 如何编写自定义的类加载器来从jar中加载类?
- 8. Tomcat jar加载
- 9. 如何为类加载器加载任意选择的JAR?
- 10. 在运行时加载jar和使用它的类
- 11. 基于安全策略限制动态加载的类和jar
- 12. JAX-RS - 从jar文件加载@Provider类
- 13. 无法从JAR文件加载主类
- 14. 如何防止从jar加载类
- 15. Xamarin绑定jar无法加载类
- 16. 如何从jar或目录加载类
- 17. Java:更新jar文件时加载类
- 18. 自定义类从jar加载ClassCastException
- 19. 从jar加载库
- 20. 从.jar加载xml
- 21. 从Jar加载ZUL
- 22. 加载外部JAR
- 23. 在jar的清单中指定默认的类加载器
- 24. 类加载器和与Apache Tomcat共享.jar文件
- 25. 使用Java Class和Jar文件找不到或加载主类
- 26. 有没有办法在运行时加载类jar和包?
- 27. 我如何检索jar中的方法列表而不加载内存中的所有文件jar?
- 28. 控制JAR如何在类路径中加载的顺序
- 29. 在不同的JAR中加载两个类
- 30. 从jar加载xslt文件加载jar本身,而不是xslt
是的,你是对的。我的实际问题是找到完整的类名(带有包),因为Class.forName()期待全名。事先我不知道jar中的类名。 – cacert 2012-04-15 09:58:03