gpt4 book ai didi

java - 对 java 9 ServiceLoader::load 方法以及如何提供服务实现的方式感到困惑

转载 作者:行者123 更新时间:2023-11-30 06:21:24 26 4
gpt4 key购买 nike

在这个java文档中: https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html将服务提供者部署为模块章节,它说:

com.example.impl.ExtendedCodecsFactory is a public class that does not implement CodecFactory, but it declares a public static no-args method named "provider" with a return type of CodecFactory.

但事实是我不能使用 provides...with 来提供服务实现,它会在不实现服务的情况下抛出编译错误和运行时错误。

我是否可以提供一个公共(public)静态提供程序方法,并且可以提供服务实现,而无需在模块信息文件中定义 provides...with ?很困惑,希望有人帮忙。

最佳答案

只要具有提供程序方法的类最终位于模块中,就可以正常工作。我刚刚创建了a small demo project表明:

// MODULE com.example.codec.api

public interface CodecFactory { }

module com.example.codec.api {
exports com.example.codec;
uses com.example.codec.CodecFactory;
}


// MODULE com.example.codec.impl

public class ExtendedCodecsFactory {

public static CodecFactory provider() {
return new CodecFactory() { };
}

}

module com.example.codec.impl {
requires com.example.codec.api;
provides com.example.codec.CodecFactory
with com.example.impl.ExtendedCodecsFactory;
}

编译:

javac
-d classes/com.example.codec.api
src/com.example.codec.api/module-info.java
src/com.example.codec.api/com/example/codec/CodecFactory.java
javac
-p classes/com.example.codec.api
-d classes/com.example.codec.impl
src/com.example.codec.impl/module-info.java
src/com.example.codec.impl/com/example/impl/ExtendedCodecsFactory.java

如果您尝试创建不在模块中的服务提供程序,则提供程序方法将不起作用。不幸的是,the documentation在这方面还不是很清楚。 在类路径上部署服务提供程序部分既没有提到提供程序构造函数,也没有提到提供程序方法,事实上,它甚至没有提到继承。

您得到的最接近的是上面的部分:

Deploying service providers as modules

[...]

A service provider that is deployed as an automatic module on the application module path must have a provider constructor. There is no support for a provider method in this case.

这包括将没有模块描述符的普通 JAR 放到模块路径上。

关于java - 对 java 9 ServiceLoader::load 方法以及如何提供服务实现的方式感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48090929/

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