java.util.ServiceLoader.load(Class<S> service,ClassLoader loader)方法实例
java.util.ServiceLoader.load(Class<S> service,ClassLoader loader) 方法创建新的服务加载器给定服务类型和类加载器。
声明
以下是java.util.ServiceLoader.load()方法的声明
public static <S> ServiceLoader<S> load(Class<S> service,ClassLoader loader)
参数
-
service -- 接口或抽象类表示服务
-
loader -- 类加载器用于加载提供者配置文件和提供者类,或null,如果系统类加载器(或者,做不到这一点,引导类加载器)是用来
返回值
此方法返回一个新的服务加载器
异常
-
NA
例子
为了要注册的服务,需要在类路径中META-INF/service文件夹。在这个特殊的文件夹,需要与实现包含单个行列出执行的具体类名的接口的名称的文本文件。在例子中的文件的名称是com.yiibai.ServiceProvider和包含这一行:
com.yiibai.ServiceImplementation
我们的服务代码如下:
package com.yiibai; public class ServiceImplementation extends ServiceProvider { public String getMessage() { return "Hello World"; } }
下面的代码加载是注册并使用它来从服务得到消息的服务:
package com.yiibai; import java.util.ServiceLoader; public abstract class ServiceProvider { public static ServiceProvider getDefault() { // load our plugin with the default system class loader ServiceLoader<ServiceProvider> serviceLoader = ServiceLoader.load(ServiceProvider.class, ClassLoader.getSystemClassLoader()); //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()); } }
让我们来编译和运行上面的程序,这将产生以下结果:
Hello World