gpt4 book ai didi

java - 无法加载类,但可以正常导入

转载 作者:行者123 更新时间:2023-11-30 01:40:51 27 4
gpt4 key购买 nike

我有这个返回空迭代器的scala代码

val i = ServiceLoader.load(Class.forName("io.grpc.netty.NettyChannelProvider"), classOf[ManagedChannelProvider].getClassLoader )

相当于java代码

Iterable i = ServiceLoader.load(Class.forName("io.grpc.netty.NettyChannelProvider"), ManagedChannelProvider.class.getClassLoader )

项目构建得很好,但在运行时这个可迭代的 i 始终为空。如何让它加载实际的类?

此外,当我们在运行时提供所有依赖项而不是包含它们时,这也有效。

最佳答案

我认为您对 ServiceLoader 的用途感到困惑。

服务加载器的要点是为其提供一个接口(interface),然后服务加载器返回每个类型“注册”为该接口(interface)的服务提供者的实例(通过调用公共(public)无参数构造函数创建)。

它通过扫描文件 META-INF/services/io.grpc.netty.NettyChannelProvider 的整个类路径来实现此目的(并且您永远不应该为此使用 Class.forName ;您应该只使用: ServiceLoader.load(ThatInterface.class) ;如果这是一个编译时错误,因为该接口(interface)不在您的类路径上,然后修复它;serviceloader 与神奇地修复类路径问题无关)。

此类文件(可以找到任意数量)由文本组成;每行一个完全限定的类名。服务加载器通过调用其公共(public)构造函数来加载每个指定的类(如果该类不存在,则会出现错误;它们必须在那里才能使用服务加载器)。

NettyChannelProvider不是一个接口(interface),它是一个实现;你的事情已经扭转了。

如果您确实尝试将 NCP 视为基本接口(interface)并且正在寻找它的实现,那么这些实现必须 [A] 在执行此代码时位于运行时类路径上,否则它们将不会被执行发现,并且 [B] 这些实现必须位于具有 META-INF/services/io.grpc.netty.NettyChannelProvider 文件的 jar 或其他类路径条目中。如果不存在,serviceloader 不会执行任何操作。

这就是 serviceloader:META-INF/services/fully.qualified.name.of.the.base.Interface 的便捷阅读器文件。

关于java - 无法加载类,但可以正常导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60066187/

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