当前位置: 首页 > 面试题库 >

与Java 1.5中的ServiceLoader相似吗?

贺俊材
2023-03-14
问题内容

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

ServiceLoader非常适合(我认为,我还没有使用过),但是我需要在Java 1.5中做到。


问题答案:

Java 1.5没有为此内置任何功能。我自己实现了它;不太复杂。但是,当我们升级到Java
6时,必须将对实现的调用替换为对的调用ServiceLoader。我本可以在应用程序和加载器之间定义一个小桥梁,但是我只在少数几个地方使用它,而包装器本身将是ServiceLoader的理想选择。

这是核心思想:

public <S> Iterable<S> load(Class<S> ifc) throws Exception {
  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;
}

更好的异常处理留给读者练习。同样,可以对方法进行参数化以接受调用者选择的ClassLoader。



 类似资料:
  • 我正在使用java。util。ServiceLoader创建轻量级插件框架。 我目前正在努力解决如何拥有多个具有相同FQN的实现类。我想在类路径上拥有同一个插件的两个副本,并且可以访问META-INF/services目录中给出的两个实现类。 以下是一些简单的eclipse项目,它们说明了我的意思:https://docs.google.com/open?id=0B4MxFm-ACB3IUmswN

  • 本文向大家介绍TF-IDF与余弦相似性的应用(二) 找出相似文章,包括了TF-IDF与余弦相似性的应用(二) 找出相似文章的使用技巧和注意事项,需要的朋友参考一下 上一次,我用TF-IDF算法自动提取关键词。 今天,我们再来研究另一个相关的问题。有些时候,除了找到关键词,我们还希望找到与原文章相似的其他文章。比如,"Google新闻"在主新闻下方,还提供多条相似的新闻。 为了找出相似的文章,需要用

  • 问题内容: 我需要在基于Java的应用程序中使用Wordnet。我想要: 搜索同义词集 找到同义词集之间的相似性/相关性 我的应用程序使用RDF图,我知道Wordnet中有SPARQL端点,但是我想最好有一个数据集的本地副本,因为它不是太大。 我发现以下罐子: 通用库 -JAWS http://lyle.smu.edu/~tspell/jaws/index.html 通用库 -JWNL http:

  • 我在读关于CRCs,我偶然发现了CRC目录和这篇关于CRC-CCITT的文章。 我基于第二个链接实现了(参见下面的代码)。 我是不是遗漏了异或运算的一些属性?在我看来,这两个算法应该有相同的输出(当然不考虑第一个算法的增强),但它们没有。 PS:可执行代码:http://ideone.com/mkuqqq

  • 问题内容: 我是一名Java程序员,并且在使用Hibernate和Struts的项目上工作了一段时间。 现在,对于我的新项目,我正在研究PHP和Mysql(学习PHP)。是否有任何类似于PHP的Hibernate技术?如果是,有人可以给我链接我可以理解和使用的链接吗? PHP中有POJO概念吗? 问题答案: 在我看来,PHP的最佳ORM是Doctrine。 您可能还希望查看Propel,看看哪种更

  • 我正在开发一个web应用程序,它应该能够在运行时加载插件。我知道OSGi将是一个优雅的解决方案,但由于使用了GWT,我看不到向OSGi的过渡。 为了实现插件,我有3个JAR:应用程序、插件API: 和插件。罐子 plugin.jar和Web应用程序依赖于pluginapi.jar.在应用程序中,我使用单独的URLClassloader加载每个jar文件,因此它们可以单独卸载。 现在,当且仅当我在应