【问题标题】:Parameters, return value of static ServiceLoader.load() method?参数,静态 ServiceLoader.load() 方法的返回值?
【发布时间】:2020-03-28 15:05:55
【问题描述】:

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

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

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

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

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

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

2这里class关键字是干什么的,我们不能直接支持SomeClass作为参数吗?

像这样,

ServiceLoader.load(SomeClass)

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

3这个方法是否返回一个包含所有接口实现的数组?

【问题讨论】:

  • 1.你读过the Javadoc吗? 2.SomeClass.classclass literal。 3. 不,它返回一个ServiceLoader<S>
  • @AndyTurner 是的,但我对在 ServiceLoader.load(SomeClass.class) 中使用 class 关键字感到困惑
  • 也许这可以帮助理解 => Class也是class

标签: java service serviceloader


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

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

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

这里提供了 meybe 提供帮助的示例代码。 Adapter 接口是服务提供者应该实现的服务:

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

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 2016-09-20
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多