java.util.ServiceLoader.reload()方法实例
java.util.ServiceLoader.reload() 方法清除该加载器的服务者缓存,所有的提供者将被重新加载。
调用此方法后,iterator方法的后续调用会懒抬起头来,从头实例化提供者,就像是一个新创建的加载器完成的。
此方法旨在用于在新的提供者可以安装到正在运行的Java虚拟机的情况。
声明
以下是java.util.ServiceLoader.reload()方法的声明
public void reload()
参数
-
NA
返回值
此方法没有返回值
异常
-
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.Iterator; import java.util.ServiceLoader; public abstract class ServiceProvider { public static ServiceProvider getDefault() { // load our plugin ServiceLoader<ServiceProvider> serviceLoader = ServiceLoader.load(ServiceProvider.class); // reload the service System.out.println("Reloading..."); serviceLoader.reload(); System.out.println("Reloaded."); // 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()); } }
让我们来编译和运行上面的程序,这将产生以下结果:
Reloading... Reloaded. Hello World