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