ServiceLoader.load 如何与 JPMS 中的 class 加载器一起工作?
How does ServiceLoader.load work with class loaders in JPMS?
我有两个 JPMS 层:
- 引导层
module A
由 ClassLoaders$AppClassLoader@4fca772d
加载
- 具有
module B
的子层提供服务并由 Loader@6b58b9e9
加载
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中的服务
我有两个 JPMS 层:
- 引导层
module A
由ClassLoaders$AppClassLoader@4fca772d
加载
- 具有
module B
的子层提供服务并由Loader@6b58b9e9
加载
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中的服务