/**
  * Creates a new service loader for the given service type, using the extension class loader.
  *
  * <p>This convenience method simply locates the extension class loader, call it
  * <tt><i>extClassLoader</i></tt>, and then returns
  *
  * <blockquote>
  *
  * <pre>
  * ServiceLoader.load(<i>service</i>, <i>extClassLoader</i>)</pre>
  *
  * </blockquote>
  *
  * <p>If the extension class loader cannot be found then the system class loader is used; if there
  * is no system class loader then the bootstrap class loader is used.
  *
  * <p>This method is intended for use when only installed providers are desired. The resulting
  * service will only find and load providers that have been installed into the current Java
  * virtual machine; providers on the application's class path will be ignored.
  *
  * @param service The interface or abstract class representing the service
  * @return A new service loader
  */
 public static <S> ServiceLoader<S> loadInstalled(Class<S> service) {
   ClassLoader cl = ClassLoader.getSystemClassLoader();
   ClassLoader prev = null;
   while (cl != null) {
     prev = cl;
     cl = cl.getParent();
   }
   return ServiceLoader.load(service, prev);
 }
 /**
  * Creates a new service loader for the given service type, using the current thread's {@linkplain
  * java.lang.Thread#getContextClassLoader context class loader}.
  *
  * <p>An invocation of this convenience method of the form
  *
  * <blockquote>
  *
  * <pre>
  * ServiceLoader.load(<i>service</i>)</pre>
  *
  * </blockquote>
  *
  * is equivalent to
  *
  * <blockquote>
  *
  * <pre>
  * ServiceLoader.load(<i>service</i>,
  *                    Thread.currentThread().getContextClassLoader())</pre>
  *
  * </blockquote>
  *
  * @param service The interface or abstract class representing the service
  * @return A new service loader
  */
 public static <S> ServiceLoader<S> load(Class<S> service) {
   ClassLoader cl = Thread.currentThread().getContextClassLoader();
   return ServiceLoader.load(service, cl);
 }