Class 加载器和服务加载器。使用了哪个 class 加载程序?

Class loaders and Service Loader. Which class loader is used?

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

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

The provider must be accessible from the same class loader that was initially queried to locate the configuration file; note that this is not necessarily the class loader from which the file was actually loaded.

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

我如何确定使用哪个 class 加载程序来定位配置文件?

Could anyone explain to me what does it mean?

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

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

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

在那种情况下,规范说无论 ClassLoader 实际上 找到配置文件,它命名的服务 类 必须可以从MyClass.class.getClassLoader()。我在这里取 "accessible" 并不是要排除它自己的授权。

在实践中,这些规定对于 ClassLoader 实现来说可能更为显着,这些实现遵循更有趣的策略,而不是简单地委托类加载器链,例如在 JavaEE 容器中可能会发现。

How could I determine which class loader it is used to locate the configuration file?

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