类加载器和服务加载器。使用哪个类加载器?

时间:2017-12-13 21:45:36

标签: java classloader serviceloader

我正致力于编写可扩展的应用程序。

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

  

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

有人能解释一下这是什么意思吗?

如何确定使用哪个类加载器来查找配置文件?

1 个答案:

答案 0 :(得分:2)

  

有人能解释一下这是什么意思吗?

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

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

要查找配置文件,那么ClassLoader MyClass可能会委托给父ClassLoader,也许可以委托给父{等等},这样它就是不是ClassLoader我查询(MyClass.class.getClassLoader())实际加载配置文件。

在这种情况下,规范说无论哪个ClassLoader 实际找到配置文件,它名称的服务类都必须可以从MyClass.class.getClassLoader()访问。我采取"可访问"这里不排除自己的代表团。

实际上,对于ClassLoader实现而言,这些规定可能比遵循更有趣的策略更为显着,而不是简单地委托ClassLoader链,例如,可以在JavaEE容器中找到。

  

如何确定使用哪个类加载器来查找配置文件?

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