java - osgi框架中class.forName()和classLoader.loadClass()有什么区别

标签 java osgi classnotfoundexception

我正在使用 apache felix osgi。当我使用 classLoader.loadClass(..) 加载类时,它给出了 ClassNotFoundException 但是当我使用 Class.forName() 加载一个类时它工作正常。

当我们使用 classLoader.loadClass() 时有什么不同?为什么我们只需要使用 Class.forName() 或者如何正确使用 classLoader.loadClass()

最佳答案

任何模块化环境中,例如 OSGi,仅通过名称加载类是不够的,因为许多模块可能有一个具有该名称的类。因此,必须使用类名应加载它的模块来唯一标识一个类。

如果您以单参数形式调用 Class.forName(),那么您将无法提供模块信息,因此 Java 会退回到使用调用者的类加载器。这并不比只是随机猜测更好。在您的情况下,它只是碰巧起作用了(它找到了类(class)),但这只是纯粹的运气!

如果您调用 ClassLoader.loadClass()——注意这不是一个静态方法——那么您实际上是在提供一个类加载器。这好多了!不幸的是,您提供了错误的加载器,即不是真正了解该类的加载器。你没有说明你从哪里得到这个加载器,所以我只能推测为什么它是错误的。

更好的方法是使用 OSGi 的 Bundle.loadClass() 方法,它允许您从包中显式加载类。同样,您需要知道该类应该来自哪个包,但这是在模块化环境中工作的必然结果。

最后,更好的办法是完全忘记动态类加载并学习如何使用服务。您永远不必在 OSGi 中使用动态类加载,除非在处理需要它的第 3 方或遗留库时。

关于java - osgi框架中class.forName()和classLoader.loadClass()有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20238536/

相关文章:

Java:写出所有包含K个1的N位序列

java - 在Java中发送邮件时是否可以屏蔽/欺骗电子邮件地址

Java 正则表达式 : need one regex to match all the formats specified

spring - Eclipse RCP、Spring、Hibernate 类加载问题

java - Eclipse Virgo 和 Eclipse Gemini 之间有什么区别?

java - 为什么在Java源文件中看不到该类

java - Android:包含用于 Retrofit2 的 SimpleXML 转换器时出现 ClassNotFoundException

java - 使用 FLAG_SECURE 允许屏幕截图

java - 使用 OSGi 进行依赖管理

eclipse - java.lang.ClassNotFoundException : org. json.JSONException 异常