gpt4 book ai didi

java - 静态ServiceLoader.load()方法的参数、返回值?

转载 作者:行者123 更新时间:2023-12-02 08:49:04 24 4
gpt4 key购买 nike

实际上这是一个由三部分组成的问题。

当我查看 static ServiceLoader.load() 的文档时方法ServiceLoader它包含的类

public static <S> ServiceLoader<S> load(Class<S> service)

1我需要知道如何调用这个方法,这个参数是什么Class<S> service

假设SomeClass是一个接口(interface)或抽象类,

我在它使用的示例中看到ServiceLoader.load(SomeClass.class)

2 什么是 class关键字在这里做我们不能简单地支持 SomeClass作为参数?

像这样,

ServiceLoader.load(SomeClass)

在它包含的文档中,此方法返回一个新的服务加载器,我对此感到困惑。

3此方法是否返回接口(interface)所有实现的数组?

最佳答案

  1. Class<S> service是服务类型的类别;例如应由服务提供者实现的接口(interface)或抽象类。 load方法是静态方法,因此调用它只需使用 ServiceLoader.load(SomeService.class)句法。

  2. load(Class<S> service)参数为服务类型的类别;所以.class调用该方法时需注明。

  3. load(Class<S> service)返回 ServiceLoader 的新实例类(class)。该类实现 Iterable界面。当您调用iterator()时对于本例,将返回一个迭代器,该迭代器延迟加载此加载程序服务的提供程序。

这里提供了一个示例代码,meybe 可以提供帮助。 Adapter接口(interface)是服务提供者应该实现的服务:

import java.util.Map;

public interface Adapter {
String getName();

String getApiVersion();

void initialize();

int calculateScore(Map<String, String> data);
}

AdapterManager类用于加载服务提供者:

import java.util.ArrayList;
import java.util.List;
import java.util.ServiceLoader;

public final class AdapterManager {
private final static ArrayList<Adapter> adapters = new ArrayList<>();
private final static AdapterManager INSTANCE = new AdapterManager();

private AdapterManager() {
load();
}

private static void load() {
updateAdapters(findServiceProviders());
}

private static List<Adapter> findServiceProviders() {
ServiceLoader<Adapter> serviceLoader = ServiceLoader.load(Adapter.class);
List<Adapter> providerList = new ArrayList<>();
for (Adapter provider : serviceLoader) {
providerList.add(provider);
}
return providerList;
}

private static synchronized void updateAdapters(List<Adapter> adapterProviders) {
adapters.clear();
adapters.addAll(adapterProviders);
}

public static AdapterManager getInstance() {
return INSTANCE;
}

public void reload() {
load();
}

public Adapter getAdapter(String name) {
if (name == null) {
throw new IllegalArgumentException("Adapter name must not be null");
}

for (Adapter adapter : adapters) {
if (name.equals(adapter.getName())) {
return adapter;
}
}
return null;
}
}

关于java - 静态ServiceLoader.load()方法的参数、返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60902402/

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