【发布时间】:2017-12-13 21:45:36
【问题描述】:
我正在编写一个可扩展的应用程序。
阅读有关ServiceLoader实用程序类的文档,我无法理解以下句子:
必须可以从最初查询配置文件的同一个类加载器访问提供程序;请注意,这不一定是实际加载文件的类加载器。
谁能给我解释一下这是什么意思?
我如何确定它用于定位配置文件的类加载器?
【问题讨论】:
标签: java classloader serviceloader
我正在编写一个可扩展的应用程序。
阅读有关ServiceLoader实用程序类的文档,我无法理解以下句子:
必须可以从最初查询配置文件的同一个类加载器访问提供程序;请注意,这不一定是实际加载文件的类加载器。
谁能给我解释一下这是什么意思?
我如何确定它用于定位配置文件的类加载器?
【问题讨论】:
标签: java classloader serviceloader
谁能给我解释一下这是什么意思?
我认为这是指ClassLoaders 可以并且确实执行委托的事实。如果我表演,比如说,
MyClass.class.getClassLoader().getResource("/services/org/my/Service");
要找到配置文件,那么可能是ClassLoader 为MyClass 委托给一个父ClassLoader,也可能是那个委托给它的父等等,所以它不是ClassLoader 我实际加载配置文件的查询(MyClass.class.getClassLoader())。
在这种情况下,规范说无论ClassLoader 实际上 定位配置文件,它命名的服务类必须可以从MyClass.class.getClassLoader() 访问。我在这里取“可访问”是为了不排除它自己的委托。
在实践中,这些规定对于ClassLoader 实现可能更显着,这些实现遵循比简单的类加载器链上的简单委托更有趣的策略,例如在 JavaEE 容器中可以找到。
我如何确定它用于定位配置文件的类加载器?
一般来说,您可能不需要这样做。作为最佳策略,我建议您确保任何给定服务配置文件命名的服务类都可以通过(全部)与配置文件本身相同的ClassLoaders 访问。例如,将它们放在同一个 jar 中应该可以实现这一点。
【讨论】: