在这个java文档中:https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html将服务提供者部署为模块章节,它说:
com.example.impl.ExtendedCodecsFactory 是一个不实现 CodecFactory 的公共类,但它声明了一个名为“provider”的公共静态无参数方法,其返回类型为 CodecFactory。
但事实是我不能使用provides...with
提供服务实现,如果不实现服务,它将抛出编译错误和运行时错误。
我是否可以提供一个公共静态提供程序方法,并且可以提供一个无需定义的服务实现provides...with
在模块信息文件中?
很困惑,希望有人帮忙。
只要具有提供者方法的类最终位于模块中,就可以正常工作。我刚刚创建一个小型演示项目 https://github.com/CodeFX-org/demo-jpms-hello-services表明:
// 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
如果您尝试创建不在模块中的服务提供程序,则提供程序方法将不起作用。很遗憾,文档 https://docs.oracle.com/javase/9/docs/api/java/util/ServiceLoader.html在这方面还不是很清楚。这部分在类路径上部署服务提供者既没有提到提供者构造函数也没有提到提供者方法,事实上它甚至没有提到继承。
您得到的最接近的是上面的部分:
将服务提供者部署为模块
[...]
作为自动模块部署在应用程序模块路径上的服务提供者必须具有提供者构造函数。在这种情况下,不支持提供者方法。
这包括将没有模块描述符的普通 JAR 放到模块路径上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)