参数,静态 ServiceLoader.load() 方法的 return 值?
Parameters, return value of static ServiceLoader.load() method?
实际上这是一个由三部分组成的问题。
当我查看 ServiceLoader
class 的 static ServiceLoader.load()
方法的文档时,它包含
public static <S> ServiceLoader<S> load(Class<S> service)
1 我需要知道怎么调用这个方法,这个参数是什么Class<S> service
?
假设SomeClass
是一个接口或抽象class,
我在示例中看到它使用 ServiceLoader.load(SomeClass.class)
2 class
关键字在这里做什么我们不能简单地支持 SomeClass
作为参数?
像这样,
ServiceLoader.load(SomeClass)
在文档中它包含这个方法returns一个新的服务加载器,我对此感到困惑。
3 这个方法 returns 是接口所有实现的数组吗?
Class<S> service
是服务类型的class;例如应由服务提供商实现的接口或抽象 class。 load
方法是一个静态方法,所以调用它只需使用 ServiceLoader.load(SomeService.class)
语法。
中load(Class<S> service)
参数是class的服务类型;所以调用这个方法的时候要注明.class
load(Class<S> service)
returns ServiceLoader
class 的新实例。 class 实现了 Iterable
接口。当您为此实例调用 iterator()
时,将返回一个迭代器,它延迟加载此加载器服务的提供程序。
这里提供了一个示例代码,meybe 可以提供帮助。 Adapter
接口是应该由服务提供者实现的服务:
import java.util.Map;
public interface Adapter {
String getName();
String getApiVersion();
void initialize();
int calculateScore(Map<String, String> data);
}
而AdapterManager
class用于加载服务商:
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;
}
}
实际上这是一个由三部分组成的问题。
当我查看 ServiceLoader
class 的 static ServiceLoader.load()
方法的文档时,它包含
public static <S> ServiceLoader<S> load(Class<S> service)
1 我需要知道怎么调用这个方法,这个参数是什么Class<S> service
?
假设SomeClass
是一个接口或抽象class,
我在示例中看到它使用 ServiceLoader.load(SomeClass.class)
2 class
关键字在这里做什么我们不能简单地支持 SomeClass
作为参数?
像这样,
ServiceLoader.load(SomeClass)
在文档中它包含这个方法returns一个新的服务加载器,我对此感到困惑。
3 这个方法 returns 是接口所有实现的数组吗?
Class<S> service
是服务类型的class;例如应由服务提供商实现的接口或抽象 class。load
方法是一个静态方法,所以调用它只需使用ServiceLoader.load(SomeService.class)
语法。中
load(Class<S> service)
参数是class的服务类型;所以调用这个方法的时候要注明.class
load(Class<S> service)
returnsServiceLoader
class 的新实例。 class 实现了Iterable
接口。当您为此实例调用iterator()
时,将返回一个迭代器,它延迟加载此加载器服务的提供程序。
这里提供了一个示例代码,meybe 可以提供帮助。 Adapter
接口是应该由服务提供者实现的服务:
import java.util.Map;
public interface Adapter {
String getName();
String getApiVersion();
void initialize();
int calculateScore(Map<String, String> data);
}
而AdapterManager
class用于加载服务商:
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;
}
}