gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:48:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com