Когда создается ModuleLayer
, каждый Module
сопоставляется с ClassLoader
.
ModuleLayer
Слой создается из графика модулей вКонфигурация и функция, отображающая каждый модуль на ClassLoader .
A ModuleLayer
не имеет понятия ClassLoader
, поскольку нет гарантии, что каждый Module
будет иметь такой же ClassLoader
.Вместо этого ClassLoader
ассоциируется с каждым отдельным Module
, который вы можете получить через Module.getClassLoader()
.
Поскольку вы используете ModuleLayer.defineModulesWithOneLoader(Configuration,ClassLoader)
1 , однако, является гарантией того, что каждый Module
будет иметь одинаковый ClassLoader
.Это означает, что вы можете получить ClassLoader
из любого Module
в ModuleLayer
и рассматривать его как "ClassLoader
из ModuleLayer
".
ModuleLayer layer = parent.defineModulesWithOneLoader(...);
ClassLoader loader = layer.modules().iterator().next().getClassLoader();
Обратите внимание, что это неработать как задумано, если:
-
ModuleLayer
пусто (не имеет Module
s). iterator().next()
сгенерирует NoSuchElementException
.
- Вы создаете
ModuleLayer
с помощью defineModulesWithManyLoaders(Configuration,ClassLoader)
1 - Каждый
Module
будет иметь свой собственный ClassLoader
.
- Вы создаете
ModuleLayer
с помощью defineModules(Configuration,Function)
и Function
не возвращает один и тот же ClassLoader
каждый раз. - Позволяет любую комбинацию от
Module
до ClassLoader
.Кроме того, у каждого ClassLoader
могут быть разные родители.Этот метод обеспечивает наибольшую гибкость при определении ModuleLayer
с.
1.Методы defineModulesWithOneLoader
и defineModulesWithManyLoaders
, по сути, являются удобными методами для defineModules
для двух предопределенных вариантов использования;каждый Module
имеет одинаковые ClassLoader
, а каждый Module
имеет свои ClassLoader
соответственно.