Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.lang.reflect.Constructor;
- import java.net.URL;
- import java.util.ArrayList;
- import java.util.Collection;
- import java.util.Enumeration;
- /**
- * Very simple replacement of {@link java.util.ServiceLoader} (from Java-6).
- *
- * @author Oifan
- *
- */
- public class ServiceLoader {
- /**
- * Replacement of {@link java.util.ServiceLoader#load(Class)} method (from Java-6).
- * @param <S>
- * @param ifc
- * @return
- * @throws Exception
- */
- public static <S> Iterable<S> load(Class<S> ifc) {
- try {
- ClassLoader ldr = Thread.currentThread().getContextClassLoader();
- Enumeration<URL> e = ldr.getResources("META-INF/services/" + ifc.getName());
- Collection<S> services = new ArrayList<S>();
- while (e.hasMoreElements()) {
- URL url = e.nextElement();
- InputStream is = url.openStream();
- try {
- BufferedReader r = new BufferedReader(new InputStreamReader(is, "UTF-8"));
- while (true) {
- String line = r.readLine();
- if (line == null)
- break;
- int comment = line.indexOf('#');
- if (comment >= 0)
- line = line.substring(0, comment);
- String name = line.trim();
- if (name.length() == 0)
- continue;
- Class<?> clz = Class.forName(name, true, ldr);
- Class<? extends S> impl = clz.asSubclass(ifc);
- Constructor<? extends S> ctor = impl.getConstructor();
- S svc = ctor.newInstance();
- services.add(svc);
- }
- } finally {
- is.close();
- }
- }
- return services;
- } catch (RuntimeException e) {
- throw e;
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement