Spec-Zone.ru › OpenJDK 21

Класс ModuleLayer

java.lang.Object
java.lang.ModuleLayer
public final class ModuleLayer extends Object
Слой модулей в виртуальной машине Java.

Слой создаётся из графа модулей в 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, и если исполняемый модуль Module X читает Module Y, то пакет экспортируется в Module Y (который может находиться в том же слое, что и X или в родительском слое).
  • Если модуль X экспортирует пакет в Y, и если исполняемый модуль Module X не читает 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
См. также:
  • Module.getLayer()

Краткое описание вложенных классов

Модификатор и тип Класс Описание
static final class  ModuleLayer.Controller
Управляет слоем модулей.

Краткое описание методов

Модификатор и тип Метод Описание
static ModuleLayer boot()
Возвращает слой загрузки.
Configuration configuration()
Возвращает конфигурацию для данного слоя.
ModuleLayer defineModules(Configuration cf, Function<String,ClassLoader> clf)
Создаёт новый слой модулей, с данным слоем в качестве родительского, определяя модули в заданной Configuration для виртуальной машины Java.
static ModuleLayer.Controller defineModules(Configuration cf, List<ModuleLayer> parentLayers, Function<String,ClassLoader> clf)
Создаёт новый слой модулей, определяя модули в заданной Configuration для виртуальной машины Java.
ModuleLayer defineModulesWithManyLoaders(Configuration cf, ClassLoader parentLoader)
Создаёт новый слой модулей, с данным слоем в качестве родительского, определяя модули в заданной Configuration для виртуальной машины Java.
static ModuleLayer.Controller defineModulesWithManyLoaders(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)
Создаёт новый слой модулей, определяя модули в заданной Configuration для виртуальной машины Java.
ModuleLayer defineModulesWithOneLoader(Configuration cf, ClassLoader parentLoader)
Создаёт новый слой модулей, с данным слоем в качестве родительского, определяя модули в заданной Configuration для виртуальной машины Java.
static ModuleLayer.Controller defineModulesWithOneLoader(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)
Создаёт новый слой модулей, определяя модули в заданной Configuration для виртуальной машины Java.
static ModuleLayer empty()
Возвращает пустой слой.
ClassLoader findLoader(String name)
Возвращает ClassLoader для модуля с заданным именем.
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 для загрузчика Bootstrap
Возвращает:
Новизна созданного слоя
Исключения:
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 для загрузчика Bootstrap
Возвращает:
Новизна созданного слоя
Исключения:
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 для загрузчика Bootstrap
Возвращает:
Контроллер, управляющий новыми созданным слоем
Исключения:
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:
Реализация определяет, является ли создание слоя с помощью этого метода атомарной операцией или нет. В результате возможно, что этот метод завершится неудачей с некоторыми модулями, но не со всеми, определёнными для виртуальной машины.
Параметры:
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API