- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试将一个基本的基于 SPI 的处理程序注册表放在一起,我从 HandlerRegistry 中查找它。当我使用 ServiceLoader.load(Handler.class) 初始化提供程序,然后迭代列表以延迟加载它们时,我没有看到该类的任何实例。为了尽可能简单,我的 HandlerRegistry 类是:
public class HandlerRegistry
{
private static HandlerRegistry registry;
private ServiceLoader<Handler> handlerLoader;
private HandlerRegistry()
{
handlerLoader = ServiceLoader.load(Handler.class);
}
public static synchronized HandlerRegistry getRegistry()
{
if (registry == null) {
registry = new HandlerRegistry();
registry.init();
}
return registry;
}
private void init()
{
System.out.println("HandlerRegistry.init()");
}
public Handler lookup(String item)
{
System.out.println("lookup("+item+")");
try {
Iterator<Handler> it = handlerLoader.iterator();
while (it.hasNext()) {
Handler handler = it.next();
System.out.println("found handler "+handler);
}
}
catch (ServiceConfigurationError err) {
err.printStackTrace();
}
return null;
}
}
我有一个 com.example.handler.Handler 接口(interface)(为简单起见,现在为空),以及一个实现该接口(interface)的 com.example.handler.handlers.DummyHandler 类。我在我的 jar 中创建了一个名为 META-INF/services/com.example.handler.Handler 的文件,其中包含单行
com.example.handler.handlers.DummyHandler
根据 javadoc。我的单元测试只是调用 lookup() 方法来验证查找项目的处理程序。当然,最终需要进行某种检查以查看这是否是该项目的正确处理程序,但此时我什至没有看到注册表加载了我的 DummyHandler 类。我在这里做错了什么吗?
谢谢!
最佳答案
答案似乎在于对其配置方式的敏感性。我一直将我的提供者名称资源文件(名为 com.example.handler.Handler 的文件)直接放在顶级项目目录中,即/resources/META-INF/services/com.example.handler.Handler。我已经配置了我的 build.gradle 来拉出文件并将其放入 jar 中:
jar { from('resources') { include 'META-INF/services/*.*' } }
当我检查 jar 文件时,文件就在那里,就在我预期的位置,所以我认为一切都很好。一脚,我碰巧把资源文件夹从下面移到 src/main 下,然后转瞬即逝!有用。我检查了 jar 文件,它看起来与以前的方式构建的文件相同,但出于某种原因,这个文件有效。如果我能确定差异,我会进一步更新,但至少我的测试用例现在可以工作了。
关于java.util.ServiceLoader 没有加载我的提供者类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18105146/
我的 ServiceLoader 不想加载我的新服务。我认为我已正确设置所有内容。 核心.主要 public class Main { public static void main(String
是否可以在注释处理器的 init(ProcessingEnvironment) 方法中使用 ServiceLoader? interface Service {} class Annotation
这是一个已知问题吗?我找不到任何搜索结果。 当迭代已经在进行时迭代 ServiceLoader 时,第一次迭代将中止。例如,假设至少有两个 Foo 的实现,以下代码将失败并出现 AssertionEr
我想了解Java ServiceLoader的概念、工作机制和具体用例,但找到官方documentation过于抽象和困惑。 首先,文档概述了服务和服务提供商。服务是一组封装在 jar 存档(API
我最近发现关于服务加载器是否会在启动后定位添加到模块路径的提供程序的相互矛盾的文档。 ServiceLoader::reload : public void reload() Clear this
在问这个之前我真的做了很多研究,好像我错过了什么。我尝试实现一个 ServiceLoader,因此制作了一个示例类: 代码很简单: testInterface.java package com.tes
使用 ServiceLoader 的最佳实践是什么?在具有多个类加载器的环境中?该文档建议在初始化时创建并保存单个服务实例: private static ServiceLoader codecSet
我遇到了 the documentation of ServiceLoader并且不清楚它适用于哪些用例。 什么时候使用ServiceLoader? 最佳答案 当您希望您的程序具有“插件”功能时,您可
JPMS ServiceLoader 无法正常工作。 我正在尝试提供一个桌面程序作为可执行jar,带有默认服务,可以由个人用户重载。用户提供他们自己的服务类,并在命令行上提供他们的名字作为参数。 服务
我有一个使用 JPMS 功能的多模块 Maven 项目。消费者模块未加载提供者模块中存在的实现。 这是 Maven 项目结构: ServiceLoaderExample ├── consumer ├─
我正在尝试弄清楚Java的ServiceLoader。我设置了一个非常基本的测试实现: public class BaseThingy { public BaseThingy(){ Itera
我遇到问题,但不知道如何解决 假设我有两个服务提供商接口(interface) (SPI) public interface View{ display(); } public interfa
我希望能够将枚举类型指示为接口(interface)实现,然后通过 ServiceLoader API 将所有枚举加载为接口(interface)的单独实例/实现。此用例的一个示例是允许 API 的下
我想知道是否可以将 ServiceLoader 与 EJB 以及来自 Java EE 6 的注入(inject)结合起来。 假设我有一个接口(interface) ServiceI,它可以由两个 EJ
我正在尝试将一个基本的基于 SPI 的处理程序注册表放在一起,我从 HandlerRegistry 中查找它。当我使用 ServiceLoader.load(Handler.class) 初始化提供程
我刚读到有关 Java 9 模块系统的信息,我想问一下 ServiceLoader .当应用程序已经启动时,有什么方法可以添加服务实现吗?删除一些服务实现怎么样? 用例:我将有一些计算某些东西的应用程
class ServiceLoader implements Iterable { // ... } interface Foo { // ... } class FooReposit
我试图找出是否有 ServiceLoader 类的 Spring 类似物,它是标准 SDK API 的一部分。如果有这样的类怎么用? 请指教! 最佳答案 假设 SpringFactoriesLoade
jjs.exe 运行的脚本是否应该能够像任何 Java 程序一样使用 ServiceLoader 定位服务? 我已将案例简化为以下脚本: function dump (stream) { (n
我的工作区中有四个 Eclipse 插件项目(创建一个新的 Java 项目,右键单击,配置,转换为插件项目)。第一个(my.runtime)包含一个接口(interface)(MyFactoryInt
我是一名优秀的程序员,十分优秀!