Advertisement
Oifan

KZTG ServiceLoader.java

Mar 16th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5 1.70 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.InputStream;
  3. import java.io.InputStreamReader;
  4. import java.lang.reflect.Constructor;
  5. import java.net.URL;
  6. import java.util.ArrayList;
  7. import java.util.Collection;
  8. import java.util.Enumeration;
  9.  
  10. /**
  11.  * Very simple replacement of {@link java.util.ServiceLoader} (from Java-6).
  12.  *
  13.  * @author Oifan
  14.  *
  15.  */
  16. public class ServiceLoader {
  17.  
  18.     /**
  19.      * Replacement of {@link java.util.ServiceLoader#load(Class)} method (from Java-6).
  20.      * @param <S>
  21.      * @param ifc
  22.      * @return
  23.      * @throws Exception
  24.      */
  25.     public static <S> Iterable<S> load(Class<S> ifc) {
  26.         try {
  27.             ClassLoader ldr = Thread.currentThread().getContextClassLoader();
  28.             Enumeration<URL> e = ldr.getResources("META-INF/services/" + ifc.getName());
  29.             Collection<S> services = new ArrayList<S>();
  30.             while (e.hasMoreElements()) {
  31.                 URL url = e.nextElement();
  32.                 InputStream is = url.openStream();
  33.                 try {
  34.                     BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));
  35.                     while (true) {
  36.                         String line = r.readLine();
  37.                         if (line == null)
  38.                             break;
  39.                         int comment = line.indexOf('#');
  40.                         if (comment >= 0)
  41.                             line = line.substring(0, comment);
  42.                         String name = line.trim();
  43.                         if (name.length() == 0)
  44.                             continue;
  45.                         Class<?> clz = Class.forName(name, true, ldr);
  46.                         Class<? extends S> impl = clz.asSubclass(ifc);
  47.                         Constructor<? extends S> ctor = impl.getConstructor();
  48.                         S svc = ctor.newInstance();
  49.                         services.add(svc);
  50.                     }
  51.                 } finally {
  52.                     is.close();
  53.                 }
  54.             }
  55.             return services;
  56.         } catch (RuntimeException e) {
  57.             throw e;
  58.         } catch (Exception e) {
  59.             throw new RuntimeException(e);
  60.         }
  61.     }
  62.  
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement