0

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

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

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

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

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

4

1 回答 1

2

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

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

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

要找到配置文件,那么可能是ClassLoaderforMyClass委托给一个 parent ClassLoader,也可能是那个委托给它的 parent 等等,所以实际上加载配置文件的不是ClassLoaderI queried ( )。MyClass.class.getClassLoader()

在这种情况下,规范说无论哪个ClassLoader 实际定位配置文件,它命名的服务类必须可以从MyClass.class.getClassLoader(). 我在这里使用“可访问”并不排除它自己的代表团。

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

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

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

于 2017-12-13T22:15:13.000 回答