参数,静态 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 是接口所有实现的数组吗?

  1. Class<S> service是服务类型的class;例如应由服务提供商实现的接口或抽象 class。 load 方法是一个静态方法,所以调用它只需使用 ServiceLoader.load(SomeService.class) 语法。

  2. load(Class<S> service)参数是class的服务类型;所以调用这个方法的时候要注明.class

  3. 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);
}

AdapterManagerclass用于加载服务商:

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;
  }
}