当前位置:  开发笔记 > 编程语言 > 正文

类似于Java 1.5中的ServiceLoader吗?

如何解决《类似于Java1.5中的ServiceLoader吗?》经验,为你挑选了2个好方法。

如何在实现定义接口的类路径中发现运行时的类?

ServiceLoader非常适合(我认为,我还没有使用它),但我需要在Java 1.5中使用它.



1> erickson..:

Java 1.5中没有内置任何内容.我自己实现了; 它并不太复杂.但是,当我们升级到Java 6时,我将不得不通过调用替换对我的实现的调用ServiceLoader.我可以在应用程序和加载器之间定义一个小桥梁,但我只在几个地方使用它,而包装器本身也是ServiceLoader的一个很好的候选者.

这是核心理念:

public  Iterable load(Class ifc) throws Exception {
  ClassLoader ldr = Thread.currentThread().getContextClassLoader();
  Enumeration e = ldr.getResources("META-INF/services/" + ifc.getName());
  Collection services = new ArrayList();
  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 impl = clz.asSubclass(ifc);
        Constructor ctor = impl.getConstructor();
        S svc = ctor.newInstance();
        services.add(svc);
      }
    }
    finally {
      is.close();
    }
  }
  return services;
}

更好的异常处理留给读者练习.此外,该方法可以参数化以接受调用者选择的ClassLoader.



2> 小智..:

javax.imageio.spi.ServiceRegistry与以前的Java版本等效.它从Java 1.4开始就可用.

它看起来不像一般的实用类,但确实如此.它甚至比ServiceLoader它更强大,因为它允许对返回的提供程序的顺序进行一些控制并直接访问注册表.

请参阅http://docs.oracle.com/javase/7/docs/api/index.html?javax/imageio/spi/ServiceRegistry.html

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有