我正在使用 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/