我有两个 JPMS 层:
module A
的引导层由 ClassLoaders$AppClassLoader@4fca772d
加载module B
的子层提供 cervices 并由 Loader@6b58b9e9
加载Loader@6b58b9e9
的父类加载器是 ClassLoaders$AppClassLoader@4fca772d
.在
module A
我有以下代码:ServiceLoader<ModuleAInterface> sl = ServiceLoader.load(ModuleAInterface.class);
但是,
Module B
的服务仅当上下文类加载器为 Loader@6b58b9e9
时才被发现当上下文类加载器为 ClassLoaders$AppClassLoader@4fca772d
时未找到.问题 - 是否可以获得
module B
的服务?在 module A
不知道 module B
的类加载器在这样的配置中。
最佳答案
查看 java.util.ServiceLoader
的代码在 jdk 14(见截图)中,当有多个 ModuleLayer
时,它看起来遵循与类加载相同的逻辑,如 this stackoverflow answer 中所述
这意味着 ServiceLoader
将首先查看自己的服务ModuleLayer
然后在其父 ModuleLayer
并以递归方式从 child 继续到 parent
is it possible to get services of module B in module A without knowing class loader of module B in such configuration.
不
但是模块 B 可以看到模块 A 中的服务
关于java - ServiceLoader.load 如何与 JPMS 中的类加载器一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61139200/