Java ServiceLoader iterator() 方法



描述

java ServiceLoader iterator() 方法延迟加载此加载程序服务的可用提供程序。此方法返回的迭代器首先按实例化顺序生成提供程序缓存中的所有元素。然后它延迟加载并实例化任何剩余的提供程序,并将每个提供程序依次添加到缓存中。

声明

以下是 java.util.ServiceLoader.iterator() 方法的声明

public Iterator<S> iterator()

参数

返回值

此方法返回一个迭代器,该迭代器延迟加载此加载程序服务的提供程序

异常

获取所有可用提供程序以进行迭代示例

为了注册服务,我们需要在类路径中有一个 META-INF/service 文件夹。在这个特定文件夹中,我们需要一个与我们实现的接口名称同名的文本文件,其中包含一行列出实现的具体类名。在我们的例子中,文件名是 com.tutorialspoint.ServiceProvider,并且包含以下行:

com.tutorialspoint.ServiceImplementation

我们的服务代码如下:

package com.tutorialspoint;

public class ServiceImplementation extends ServiceProvider {
   public String getMessage() {
      return "Hello World";
   }
}

以下代码加载已注册的服务并使用它从服务获取消息。我们创建了一个 getDefault() 方法,该方法返回一个 ServiceProvider。此方法使用 ServiceLoader.load() 获取一个 serviceLoader 对象。使用 serviceLoader.iterator() 方法,我们检索了迭代器,并使用 iterator.hasNext() 方法检查服务实现是否存在。然后迭代迭代器并返回第一个提供程序。最后,如果未返回提供程序,我们将抛出错误。然后使用 getDefault() 我们检索了 serviceProvider 并使用此对象打印了消息。

package com.tutorialspoint;

import java.util.Iterator;
import java.util.ServiceLoader;

public abstract class ServiceProvider {
   public static ServiceProvider getDefault() {

      // load our plugin
      ServiceLoader<ServiceProvider> serviceLoader =
         ServiceLoader.load(ServiceProvider.class);

      // load the available providers of this loader's service.
      Iterator<ServiceProvider> iterator = serviceLoader.iterator();

      // check if there is a provider
      System.out.println("Iterator has more provider:" + iterator.hasNext());

      // checking if load was successful
      for (ServiceProvider provider : serviceLoader) {
         return provider;
      }
      throw new Error("Something is wrong with registering the addon");
   }

   public abstract String getMessage();

   public static void main(String[] ignored) {
      
      // create a new provider and call getMessage()
      ServiceProvider provider = ServiceProvider.getDefault();
      System.out.println(provider.getMessage());
   }
}

输出

让我们编译并运行以上程序,这将产生以下结果:

Iterator has more providers:true
Hello World
java_util_serviceloader.htm
广告