- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何在运行时发现类路径中实现已定义接口(interface)的类?
ServiceLoader 很适合(我想,我没用过),但我需要在 Java 1.5 中使用它。
最佳答案
Java 1.5 中没有为此内置任何内容。我自己实现了;这不是太复杂。但是,当我们升级到 Java 6 时,我将不得不将对我的实现的调用替换为对 ServiceLoader
的调用。我本可以在应用程序和加载程序之间定义一个小桥梁,但我只在几个地方使用它,而包装器本身将是 ServiceLoader 的一个很好的候选者。
这是核心思想:
public <S> Iterable<S> load(Class<S> ifc) throws Exception {
ClassLoader ldr = Thread.currentThread().getContextClassLoader();
Enumeration<URL> e = ldr.getResources("META-INF/services/" + ifc.getName());
Collection<S> services = new ArrayList<S>();
while (e.hasMoreElements()) {
URL url = e.nextElement();
InputStream is = url.openStream();
try {
BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));
while (true) {
String line = r.readLine();
if (line == null)
break;
int comment = line.indexOf('#');
if (comment >= 0)
line = line.substring(0, comment);
String name = line.trim();
if (name.length() == 0)
continue;
Class<?> clz = Class.forName(name, true, ldr);
Class<? extends S> impl = clz.asSubclass(ifc);
Constructor<? extends S> ctor = impl.getConstructor();
S svc = ctor.newInstance();
services.add(svc);
}
}
finally {
is.close();
}
}
return services;
}
更好的异常处理留给读者作为练习。此外,该方法可以参数化以接受调用者选择的 ClassLoader。
关于java - 有没有类似Java 1.5中的ServiceLoader的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/251336/
我的 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
我是一名优秀的程序员,十分优秀!