Класс ModuleLayer
public final class ModuleLayer extends Object
Слой создаётся из графа модулей в Configuration и функции, которая сопоставляет каждый модуль с ClassLoader. Создание слоя информирует виртуальную машину Java о классах, которые могут быть загружены из модулей, чтобы виртуальная машина знала, к какому модулю принадлежит каждый класс.
Создание слоя создаёт объект Module для каждого ResolvedModule в конфигурации. Для каждого разрешённого модуля, который read, Module reads соответствующий модуль runtime Module, который может находиться в том же слое или в parent слое.
Методы defineModulesWithOneLoader и defineModulesWithManyLoaders предоставляют удобный способ создания слоя модулей, где все модули сопоставлены с одним загрузчиком классов или где каждый модуль сопоставлен с собственным загрузчиком классов. Метод defineModules предназначен для более сложных случаев, когда модули сопоставляются с пользовательскими загрузчиками классов с помощью функции, указанной в методе. Каждый из этих методов имеет экземплярный и статический вариант. Экземплярные методы создают слой с текущим слоем в качестве родительского. Статические методы предназначены для более сложных случаев, когда может быть более одного родительского слоя или когда требуется Controller для управления модулями в слое
Виртуальная машина Java имеет по крайней мере один непустой слой, boot слой, который создаётся при запуске виртуальной машины Java. Слой загрузки содержит модули java.base и является единственным слоем в виртуальной машине Java с модулем под названием "java.base". Модули в слое загрузки сопоставляются с загрузчиком базовых классов и другими загрузчиками классов, которые являются встроенными в виртуальную машину Java. Слой загрузки часто будет parent при создании дополнительных слоев.
Каждый Module в слое создаётся так, чтобы он exports и opens пакеты, описанные в его ModuleDescriptor. Квалифицированные экспорты (где пакет экспортируется в набор целевых модулей, а не во все модули) уточняются при создании слоя следующим образом:
- Если модуль
Xэкспортирует пакет вY, и если исполняемый модульModuleXчитаетModuleY, то пакет экспортируется вModuleY(который может находиться в том же слое, что иXили в родительском слое). - Если модуль
Xэкспортирует пакет вY, и если исполняемый модульModuleXне читаетY, то целевой модульYнаходится так, как если бы вызвалсяfindModuleдля поиска модуля в слое или его родительских слоях. ЕслиYнайден, то пакет экспортируется в экземплярY, который был найден. ЕслиYне найден, то квалифицированный экспорт игнорируется.
Квалифицированные открытия обрабатываются так же, как и квалифицированные экспорты.
Как и при создании Configuration, модули automatic получают специальное лечение при создании слоя. Автоматический модуль создаётся в виртуальной машине Java как модуль Module , который считывает каждый безымянный
Module в виртуальной машине Java.
Если не указано иное, передача аргумента null методу в этом классе приводит к исключению NullPointerException.
Пример
В этом примере создаётся конфигурация путём разрешения модуля под названием "myapp" с конфигурацией слоя загрузки в качестве родительского. Затем создаётся новый слой с модулями в этой конфигурации. Все модули определены для одного и того же загрузчика классов.
ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
ModuleLayer parent = ModuleLayer.boot();
Configuration cf = parent.configuration()
.resolve(finder, ModuleFinder.of(), Set.of("myapp"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl);
Class<?> c = layer.findLoader("myapp").loadClass("app.Main");
- Since:
- 9
- См. также:
Краткое описание вложенных классов
| Модификатор и тип | Класс | Описание |
|---|---|---|
static final class |
ModuleLayer.Controller |
Управляет слоем модулей. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
static ModuleLayer |
boot() |
Возвращает слой загрузки. |
Configuration |
configuration() |
Возвращает конфигурацию для данного слоя. |
ModuleLayer |
defineModules |
Создаёт новый слой модулей, с данным слоем в качестве родительского, определяя модули в заданной Configuration для виртуальной машины Java. |
static ModuleLayer.Controller |
defineModules |
Создаёт новый слой модулей, определяя модули в заданной
Configuration для виртуальной машины Java. |
ModuleLayer |
defineModulesWithManyLoaders |
Создаёт новый слой модулей, с данным слоем в качестве родительского, определяя модули в заданной Configuration для виртуальной машины Java. |
static ModuleLayer.Controller |
defineModulesWithManyLoaders |
Создаёт новый слой модулей, определяя модули в заданной
Configuration для виртуальной машины Java. |
ModuleLayer |
defineModulesWithOneLoader |
Создаёт новый слой модулей, с данным слоем в качестве родительского, определяя модули в заданной Configuration для виртуальной машины Java. |
static ModuleLayer.Controller |
defineModulesWithOneLoader |
Создаёт новый слой модулей, определяя модули в заданной
Configuration для виртуальной машины Java. |
static ModuleLayer |
empty() |
Возвращает пустой слой. |
ClassLoader |
findLoader |
Возвращает ClassLoader для модуля с заданным именем. |
Optional |
findModule |
Возвращает модуль с заданным именем в данном слое, или если не в этом слое, в родительских слоях. |
Set |
modules() |
Возвращает неизменяемый набор модулей в данном слое. |
List |
parents() |
Возвращает неизменяемый список родителей этого слоя, в порядке поиска. |
String |
toString() |
Возвращает строку, описывающую данный слой модулей. |
Подробности методов
defineModulesWithOneLoader
public ModuleLayer defineModulesWithOneLoader(Configuration cf, ClassLoader parentLoader)
Configuration для виртуальной машины Java. Данный метод создаёт один загрузчик классов и определяет все модули для этого загрузчика. parent каждого загрузчика классов является заданным родительским загрузчиком. Данный метод работает точно так же, как и указано в статическом методе defineModulesWithOneLoader, когда вызывается с этим слоем в качестве родительского. Другими словами, если этот слой thisLayer , то этот метод эквивалентен вызову:
ModuleLayer.defineModulesWithOneLoader(cf, List.of(thisLayer), parentLoader).layer();
- Параметры:
-
cf- Конфигурация для слоя -
parentLoader- Родительский загрузчик классов для загрузчика классов, созданного этим методом; может бытьnullдля загрузчика Bootstrap - Возвращает:
- Новизна созданного слоя
- Исключения:
-
IllegalArgumentException- Если заданная конфигурация имеет более одного родителя или родитель конфигурации не является конфигурацией для этого слоя -
LayerInstantiationException- Если слой не может быть создан по любой из причин, указанных в статическом методеdefineModulesWithOneLoader -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
defineModulesWithManyLoaders
public ModuleLayer defineModulesWithManyLoaders(Configuration cf, ClassLoader parentLoader)
Configuration для виртуальной машины Java. Каждый модуль определяется для собственного ClassLoader, созданного этим методом. parent каждого загрузчика классов является заданным родительским загрузчиком. Данный метод работает точно так же, как и указано в статическом методе defineModulesWithManyLoaders, когда вызывается с этим слоем в качестве родительского. Другими словами, если этот слой thisLayer , то этот метод эквивалентен вызову:
ModuleLayer.defineModulesWithManyLoaders(cf, List.of(thisLayer), parentLoader).layer();
- Параметры:
-
cf- Конфигурация для слоя -
parentLoader- Родительский загрузчик классов для каждого из загрузчиков классов, созданных этим методом; может бытьnullдля загрузчика Bootstrap - Возвращает:
- Новизна созданного слоя
- Исключения:
-
IllegalArgumentException- Если заданная конфигурация имеет более одного родителя или родитель конфигурации не является конфигурацией для этого слоя -
LayerInstantiationException- Если слой не может быть создан по любой из причин, указанных в статическом методеdefineModulesWithManyLoaders -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
defineModules
public ModuleLayer defineModules(Configuration cf, Function<String,ClassLoader> clf)
Configuration для виртуальной машины Java. Каждый модуль отображается по имени на его загрузчик классов с помощью заданной функции. Данный метод работает точно так же, как и указано в статическом методе defineModules, когда вызывается с этим слоем в качестве родительского. Другими словами, если этот слой thisLayer , то этот метод эквивалентен вызову:
ModuleLayer.defineModules(cf, List.of(thisLayer), clf).layer();
- Параметры:
-
cf- Конфигурация для слоя -
clf- Функция для отображения имени модуля на загрузчик классов - Возвращает:
- Новизна созданного слоя
- Исключения:
-
IllegalArgumentException- Если заданная конфигурация имеет более одного родителя или родитель конфигурации не является конфигурацией для этого слоя -
LayerInstantiationException- Если слой не может быть создан по любой из причин, указанных в статическом методеdefineModules -
SecurityException- ЕслиRuntimePermission("getClassLoader")запрещено менеджером безопасности
defineModulesWithOneLoader
public static ModuleLayer.Controller defineModulesWithOneLoader(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)
Configuration для виртуальной машины Java. Данный метод создаёт один загрузчик классов и определяет все модули для этого загрузчика. Загрузчик классов, созданный этим методом, реализует прямую делегацию при загрузке классов из модулей. Если метод loadClass вызывается для загрузки класса, то он использует имя пакета класса для его сопоставления с модулем. Это может быть модуль в этом слое и, следовательно, определён для того же загрузчика классов. Это может быть пакет в модуле в родительском слое, который экспортирован в один или несколько модулей в этом слое. Загрузчик делегирует загрузчику класса модуля, выбросив
ClassNotFoundException если не найден этим загрузчиком. Когда loadClass вызывается для загрузки классов, которые не сопоставляются с модулем, то он делегирует родительскому загрузчику классов.
Загрузчик классов, созданный этим методом, находит ресурсы (getResource, getResources и другие методы ресурсов) во всех модулях в слое перед поиском в родительском загрузчике классов.
Попытка создать слой со всеми модулями, определёнными в одном загрузчике классов, может потерпеть неудачу по следующим причинам:
Перекрывающиеся пакеты: Два или более модулей в конфигурации имеют одинаковый пакет.
Разделение делегирования: Результирующий загрузчик классов должен был бы делегировать более чем одному загрузчику классов, чтобы загрузить классы в определённый пакет.
Кроме того, слой не может быть создан, если конфигурация содержит модуль с именем "java.base", или модуль содержит пакет с именем "java" или пакет с именем, начинающимся с "java.".
Если существует менеджер безопасности, то загрузчик классов, созданный этим методом, будет загружать классы и ресурсы с привилегиями, ограниченными контекстом вызова этого метода.
- Параметры:
-
cf- Конфигурация для слоя -
parentLayers- Список родительских слоёв в порядке поиска -
parentLoader- Родительский загрузчик классов для загрузчика классов, созданного этим методом; может бытьnullдля загрузчика Bootstrap - Возвращает:
- Контроллер, управляющий новыми созданным слоем
- Исключения:
-
IllegalArgumentException- Если родитель(и) заданной конфигурации не соответствуют конфигурации родительских слоёв, включая порядок -
LayerInstantiationException- Если все модули не могут быть определены в одном загрузчике классов по какой-либо из вышеперечисленных причин -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
defineModulesWithManyLoaders
public static ModuleLayer.Controller defineModulesWithManyLoaders(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)
Configuration для виртуальной машины Java. Каждый модуль определяется со своим собственным ClassLoader, созданным этим методом. Родительским parent каждого загрузчика классов является заданный родительский загрузчик классов. Загрузчики классов, созданные этим методом, реализуют прямую делегацию при загрузке классов из модулей. Если вызывается метод loadClass для загрузки класса, то он использует имя пакета класса для его сопоставления с модулем. Пакет может находиться в модуле, определённом для загрузчика классов. Пакет может быть экспортирован другим модулем в этом слое для модуля, определённого для загрузчика классов. Он также может находиться в пакете, экспортированном модулем в родительском слое. Загрузчик классов делегирует загрузчику класса модуля, генерируя ClassNotFoundException если он не найден этим загрузчиком. Когда вызывается loadClass для загрузки класса, который не сопоставляется с модулем, то делегирование происходит родительскому загрузчику классов.
Загрузчики классов, созданные этим методом, ищут ресурсы (getResource, getResources и другие методы ресурсов) в модуле, определённом для загрузчика классов, прежде чем искать их в родительском загрузчике классов.
Если установлен менеджер безопасности, то загрузчики классов, созданные этим методом, будут загружать классы и ресурсы с привилегиями, ограниченными контекстом вызова этого метода.
- Параметры:
-
cf- Конфигурация слоя -
parentLayers- Список родительских слоёв в порядке поиска -
parentLoader- Родительский загрузчик классов для каждого созданного этим методом загрузчика классов; может бытьnullдля загрузчика классов загрузки - Возвращает:
- Контроллер, управляющий вновь созданным слоем
- Исключения:
-
IllegalArgumentException- Если родитель(и) заданной конфигурации не соответствуют конфигурации родительских слоёв, включая порядок -
LayerInstantiationException- Если слой не может быть создан, потому что конфигурация содержит модуль с именем "java.base" или модуль содержит пакет с именем "java" или пакет с именем, начинающимся с "java." -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
defineModules
public static ModuleLayer.Controller defineModules(Configuration cf, List<ModuleLayer> parentLayers, Function<String,ClassLoader> clf)
Configuration для виртуальной машины Java. Заданная функция сопоставляет каждый модуль в конфигурации по имени с загрузчиком классов. Создание слоя информирует виртуальную машину Java о классах, которые могут быть загружены, чтобы виртуальная машина знала, к какому модулю принадлежит каждый класс. Делегирование загрузчика классов, реализованное загрузчиками классов, должно учитывать читаемость модулей. Загрузчики классов должны быть parallel-capable, чтобы избежать тупиков при загрузке классов. Кроме того, сущность, создающая новый слой с помощью этого метода, должна обеспечить готовность загрузчиков классов к загрузке из этих модулей до любых попыток загрузки классов или ресурсов.
Создание слоя может завершиться неудачей по следующим причинам:
Два или более модуля с одинаковым пакетом сопоставлены с одним загрузчиком классов.
Модуль сопоставлен с загрузчиком классов, которому уже определён модуль с тем же именем.
Модуль сопоставлен с загрузчиком классов, который уже определил типы в любом из пакетов модуля.
Кроме того, слой не может быть создан, если конфигурация содержит модуль с именем "java.base", конфигурация содержит модуль с пакетом, названным "java", или имя пакета, начинающееся с "java.", или функция для сопоставления имени модуля с загрузчиком классов возвращает null или платформенный загрузчик классов.
Если функция сопоставления имени модуля с загрузчиком классов выбрасывает ошибку или исключение выполнения, то оно передаётся вызывающему методу.
- Примечание API:
- Реализация определяет, является ли создание слоя с помощью этого метода атомарной операцией или нет. В результате возможно, что этот метод завершится неудачей с некоторыми модулями, но не со всеми, определёнными для виртуальной машины.
- Параметры:
-
cf- Конфигурация слоя -
parentLayers- Список родительских слоёв в порядке поиска -
clf- Функция для сопоставления имени модуля с загрузчиком классов - Возвращает:
- Контроллер, управляющий вновь созданным слоем
- Исключения:
-
IllegalArgumentException- Если родитель(и) заданной конфигурации не соответствуют конфигурации родительских слоёв, включая порядок -
LayerInstantiationException- Если создание слоя завершается неудачей по любой из перечисленных выше причин -
SecurityException- ЕслиRuntimePermission("getClassLoader")запрещено менеджером безопасности
configuration
public Configuration configuration()
- Возвращает:
- Конфигурация для этого слоя
parents
public List<ModuleLayer> parents()
- Возвращает:
- Возможный пустой неизменяемый список родителей этого слоя
modules
public Set<Module> modules()
- Возвращает:
- Возможный пустой неизменяемый набор модулей в этом слое
findModule
public Optional<Module> findModule(String name)
findModule для каждого родителя в порядке поиска, пока модуль не будет найден или все родители не будут проверены. В дереве слоёв это эквивалентно поиску в глубину.- Параметры:
-
name- Имя модуля для поиска - Возвращает:
- Модуль с заданным именем или пустой
Optional, если в этом слое или любом родительском слое нет модуля с этим именем
findLoader
public ClassLoader findLoader(String name)
ClassLoader для модуля с заданным именем. Если модуль с заданным именем не в этом слое, то ищутся родительские parent слои способом, указанным в findModule. Если установлен менеджер безопасности, то вызывается его метод checkPermission с разрешением RuntimePermission("getClassLoader") для проверки возможности доступа вызывающего к загрузчику классов.
- Примечание API:
- Этот метод не возвращает
Optional<ClassLoader>, потому что `null` должен использоваться для представления загрузчика классов загрузки. - Параметры:
-
name- Имя модуля для поиска - Возвращает:
- Загрузчик классов, которому определён модуль
- Исключения:
-
IllegalArgumentException- если модуль с заданным именем не определён в этом слое или в любом родителе этого слоя -
SecurityException- если запрещено менеджером безопасности
toString
public String toString()
- Переопределяет:
-
toStringв классеObject - Возвращает:
- Возможная пустая строка, описывающая этот слой модулей
empty
public static ModuleLayer empty()
- Возвращает:
- Пустой слой
boot
public static ModuleLayer boot()
java.base. Его родителем является empty слой.- Примечание API:
- Этот метод возвращает
nullво время запуска и до полного инициализации слоя загрузки. - Возвращает:
- Слой загрузки
© 1993, 2023, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/ModuleLayer.html