/src/main/java/com/alibaba/fastjson/util/ServiceLoader.java
Java | 89 lines | 73 code | 14 blank | 2 comment | 11 complexity | 20107e50a260b02945dab7be495eb040 MD5 | raw file
- package com.alibaba.fastjson.util;
- import java.io.BufferedReader;
- import java.io.Closeable;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.net.URL;
- import java.util.Enumeration;
- import java.util.HashSet;
- import java.util.Set;
- public class ServiceLoader {
- private static final String PREFIX = "META-INF/services/";
-
- private static final Set<String> loadedUrls = new HashSet<String>();
- @SuppressWarnings("unchecked")
- public static <T> Set<T> load(Class<T> clazz, ClassLoader classLoader) {
- Set<T> services = new HashSet<T>();
- String className = clazz.getName();
- String path = PREFIX + className;
- Set<String> serviceNames = new HashSet<String>();
- try {
- Enumeration<URL> urls = classLoader.getResources(path);
- while (urls.hasMoreElements()) {
- URL url = urls.nextElement();
- if (loadedUrls.contains(url.toString())) {
- continue;
- }
- load(url, serviceNames);
- loadedUrls.add(url.toString());
- }
- } catch (IOException ex) {
- // skip
- }
- for (String serviceName : serviceNames) {
- try {
- Class<?> serviceClass = classLoader.loadClass(serviceName);
- T service = (T) serviceClass.newInstance();
- services.add(service);
- } catch (Exception e) {
- // skip
- }
- }
- return services;
- }
- public static void load(URL url, Set<String> set) throws IOException {
- InputStream is = null;
- BufferedReader reader = null;
- try {
- is = url.openStream();
- reader = new BufferedReader(new InputStreamReader(is, "utf-8"));
- for (;;) {
- String line = reader.readLine();
- if (line == null) {
- break;
- }
- int ci = line.indexOf('#');
- if (ci >= 0) {
- line = line.substring(0, ci);
- }
- line = line.trim();
- if (line.length() == 0) {
- continue;
- }
- set.add(line);
- }
- } finally {
- close(reader);
- close(is);
- }
- }
- public static void close(Closeable x) throws IOException {
- if (x != null) {
- x.close();
- }
- }
- }