ServiceLoader.load 如何与 JPMS 中的 class 加载器一起工作?

How does ServiceLoader.load work with class loaders in JPMS?

我有两个 JPMS 层:

  1. 引导层 module AClassLoaders$AppClassLoader@4fca772d
  2. 加载
  3. 具有 module B 的子层提供服务并由 Loader@6b58b9e9
  4. 加载

Loader@6b58b9e9 的父 classloader 是 ClassLoaders$AppClassLoader@4fca772d

module A中我有以下代码:

ServiceLoader<ModuleAInterface> sl = ServiceLoader.load(ModuleAInterface.class);

但是,Module B 的服务仅在 context class loader 为 Loader@6b58b9e9 时找到,而在 context class loader 为 ClassLoaders$AppClassLoader@4fca772d 时找不到。

问题 - 在不知道 module B 的 class 加载程序的情况下,是否可以在 module A 中获得 module B 的服务。

查看 jdk 14 中 java.util.ServiceLoader 的代码(见屏幕截图)看起来它遵循与 class 加载多个 ModuleLayer 时相同的逻辑, 如

中所述

这意味着 ServiceLoader 将首先在其自身 ModuleLayer 中查看服务,然后在其父 ModuleLayer 中查看服务,并以递归方式从子项到父项继续

is it possible to get services of module B in module A without knowing class loader of module B in such configuration.

没有
但是模块B可以看到模块A中的服务