Класс ModuleLayer
- java.lang.Object
-
- java.lang.ModuleLayer
public final class ModuleLayer extends Object
Слой модулей в виртуальной машине Java.
Слой создается из графа модулей в Configuration и функции, которая сопоставляет каждый модуль с ClassLoader. Создание слоя информирует виртуальную машину Java о классах, которые могут быть загружены из модулей, чтобы виртуальная машина знала, к какому модулю принадлежит каждый класс.
Создание слоя создает объект Module для каждого ResolvedModule в конфигурации. Для каждого разрешенного модуля, который read, Module reads соответствующий исполняемый Module, который может находиться в том же слое или в parent слое.
Методы defineModulesWithOneLoader и defineModulesWithManyLoaders предоставляют удобные способы создания слоя модулей, где все модули сопоставляются с одним загрузчиком классов или где каждый модуль сопоставляется со своим собственным загрузчиком классов. Метод defineModules предназначен для более сложных случаев, когда модули сопоставляются с пользовательскими загрузчиками классов с помощью функции, указанной в методе. Каждый из этих методов имеет инстанс- и статический варианты. Методы-инстансы создают слой с получателем в качестве родительского слоя. Статические методы предназначены для более сложных случаев, когда может быть более одного родительского слоя или когда требуется Controller для управления модулями в слое
У виртуальной машины Java есть по крайней мере один непустой слой, boot слой, который создается при запуске виртуальной машины Java. Слой загрузки содержит модуль java.base и является единственным слоем в виртуальной машине Java с модулем, названным "java.base". Модули в слое загрузки сопоставляются с загрузчиком bootstrap-классов и другими загрузчиками классов, которые являются встроенными в виртуальную машину 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");
- С тех пор:
- 9
- См. также:
Module.getLayer()
Вложенные классы
| Модификатор и тип | Класс | Описание |
|---|---|---|
static class | ModuleLayer.Controller | Управляет слоем модулей. |
Методы
| Модификатор и тип | Метод | Описание |
|---|---|---|
static ModuleLayer | boot() | Возвращает слой загрузки. |
Configuration | configuration() | Возвращает конфигурацию для этого слоя. |
ModuleLayer | defineModules(Configuration cf,
Function<String,ClassLoader> clf) | Создает новый слой модулей, с этим слоем в качестве родительского, определяя модули в заданном |
static ModuleLayer.Controller | defineModules(Configuration cf,
List<ModuleLayer> parentLayers,
Function<String,ClassLoader> clf) | Создает новый слой модулей, определяя модули в заданном |
ModuleLayer | defineModulesWithManyLoaders(Configuration cf,
ClassLoader parentLoader) | Создает новый слой модулей, с этим слоем в качестве родительского, определяя модули в заданном |
static ModuleLayer.Controller | defineModulesWithManyLoaders(Configuration cf,
List<ModuleLayer> parentLayers,
ClassLoader parentLoader) | Создает новый слой модулей, определяя модули в заданном |
ModuleLayer | defineModulesWithOneLoader(Configuration cf,
ClassLoader parentLoader) | Создает новый слой модулей, с этим слоем в качестве родительского, определяя модули в заданном |
static ModuleLayer.Controller | defineModulesWithOneLoader(Configuration cf,
List<ModuleLayer> parentLayers,
ClassLoader parentLoader) | Создает новый слой модулей, определяя модули в заданном |
static ModuleLayer | empty() | Возвращает пустой слой. |
ClassLoader | findLoader(String name) | Возвращает |
Optional<Module> | findModule(String name) | Возвращает модуль с заданным именем в этом слое, или, если нет в этом слое, родительские слои. |
Set<Module> | modules() | Возвращает набор модулей в этом слое. |
List<ModuleLayer> | parents() | Возвращает список родителей этого слоя, если это не пустой слой, у которого нет родителей, и, следовательно, возвращается пустой список. |
String | toString() | Возвращает строку, описывающую этот слой модулей. |
Методы, объявленные в классе java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait Методы
defineModulesWithOneLoader
public ModuleLayer defineModulesWithOneLoader(Configuration cf,
ClassLoader parentLoader) Создаёт новый слой модулей, с этим слоем в качестве родительского, определяя модули, указанные в переданной Configuration для виртуальной машины Java. Этот метод создаёт один загрузчик классов и определяет все модули для этого загрузчика. Родительским (parent) каждого загрузчика классов является переданный родительский загрузчик классов. Этот метод работает точно так же, как и указанный статический метод defineModulesWithOneLoader, при вызове с этим слоем в качестве родителя. Другими словами, если этот слой является thisLayer, то этот метод эквивалентен вызову:
ModuleLayer.defineModulesWithOneLoader(cf, List.of(thisLayer), parentLoader).layer();
- Параметры:
-
cf- Конфигурация для слоя -
parentLoader- Родительский загрузчик классов для загрузчика классов, созданного этим методом; может бытьnullдля загрузчика базовых классов - Возвращает:
- Созданный новый слой
- Выбрасывает:
-
IllegalArgumentException- Если у данной конфигурации больше одного родителя или родитель конфигурации не является конфигурацией для этого слоя -
LayerInstantiationException- Если слой не может быть создан по какой-либо из причин, указанных в статическом методеdefineModulesWithOneLoader -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
findLoader(java.lang.String)
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для загрузчика базовых классов - Возвращает:
- Созданный новый слой
- Выбрасывает:
-
IllegalArgumentException- Если у данной конфигурации больше одного родителя или родитель конфигурации не является конфигурацией для этого слоя -
LayerInstantiationException- Если слой не может быть создан по какой-либо из причин, указанных в статическом методеdefineModulesWithManyLoaders -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
findLoader(java.lang.String)
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для загрузчика базовых классов - Возвращает:
- Контроллер, управляющий созданным новым слоем
- Выбрасывает:
-
IllegalArgumentException- Если родитель(и) заданной конфигурации не соответствуют конфигурации родительских слоёв, включая порядок -
LayerInstantiationException- Если все модули не могут быть определены в одном загрузчике классов по какой-либо из вышеперечисленных причин -
SecurityException- ЕслиRuntimePermission("createClassLoader")илиRuntimePermission("getClassLoader")запрещено менеджером безопасности - См. также:
findLoader(java.lang.String)
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")запрещено менеджером безопасности - См. также:
findLoader(java.lang.String)
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:
- Реализация определяет, является ли создание слоя с помощью этого метода атомарной операцией или нет. Следовательно, этот метод может завершиться неудачно с некоторыми, но не со всеми, определенными модулями для виртуальной машины Java.
- Параметры:
-
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 для модуля с заданным именем. Если модуль с заданным именем отсутствует в этом слое, то в порядке, указанном в findModule, ищут в родительских parent слоях.
Если есть менеджер безопасности, то вызывается его метод 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, 2020, 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/11/docs/api/java.base/java/lang/ModuleLayer.html