【问题标题】:Class loaders and Service Loader. Which class loader is used?类加载器和服务加载器。使用哪个类加载器?
【发布时间】:2017-12-13 21:45:36
【问题描述】:

我正在编写一个可扩展的应用程序。

阅读有关ServiceLoader实用程序类的文档,我无法理解以下句子:

必须可以从最初查询配置文件的同一个类加载器访问提供程序;请注意,这不一定是实际加载文件的类加载器。

谁能给我解释一下这是什么意思?

我如何确定它用于定位配置文件的类加载器?

【问题讨论】:

    标签: java classloader serviceloader


    【解决方案1】:

    谁能给我解释一下这是什么意思?

    我认为这是指ClassLoaders 可以并且确实执行委托的事实。如果我表演,比如说,

    MyClass.class.getClassLoader().getResource("/services/org/my/Service");
    

    要找到配置文件,那么可能是ClassLoaderMyClass 委托给一个父ClassLoader,也可能是那个委托给它的父等等,所以它不是ClassLoader 我实际加载配置文件的查询(MyClass.class.getClassLoader())。

    在这种情况下,规范说无论ClassLoader 实际上 定位配置文件,它命名的服务类必须可以从MyClass.class.getClassLoader() 访问。我在这里取“可访问”是为了不排除它自己的委托。

    在实践中,这些规定对于ClassLoader 实现可能更显着,这些实现遵循比简单的类加载器链上的简单委托更有趣的策略,例如在 JavaEE 容器中可以找到。

    我如何确定它用于定位配置文件的类加载器?

    一般来说,您可能不需要这样做。作为最佳策略,我建议您确保任何给定服务配置文件命名的服务类都可以通过(全部)与配置文件本身相同的ClassLoaders 访问。例如,将它们放在同一个 jar 中应该可以实现这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2014-06-16
      • 1970-01-01
      • 2017-06-17
      相关资源
      最近更新 更多