Spec-Zone.ru › OpenJDK 17

Класс 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". Модули в загрузочном слое сопоставлены с загрузчиком базового класса и другими загрузчиками классов, которые являются встроенными в виртуальную машину 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 в виртуальной машине 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)
Возвращает модуль с заданным именем.
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 и другие методы ресурсов) в модуле, определённом для загрузчика классов, прежде чем искать в родительском загрузчике классов.

Если установлен менеджер безопасности, то загрузчики классов, созданные этим методом, будут загружать классы и ресурсы с привилегиями, ограниченными контекстом вызова этого метода.

Parameters:
cf - Конфигурация слоя
parentLayers - Список родительских слоёв в порядке поиска
parentLoader - Родительский загрузчик классов для каждого из загрузчиков классов, созданных этим методом; может быть null для загрузчика классов Bootstrap
Returns:
Контроллер, управляющий вновь созданным слоем
Throws:
IllegalArgumentException - Если родитель(и) заданной конфигурации не соответствуют конфигурации родительских слоёв, включая порядок
LayerInstantiationException - Если слой не может быть создан, потому что конфигурация содержит модуль с именем "java.base" или модуль содержит пакет с именем "java" или пакет с именем, начинающимся с "java."
SecurityException - Если RuntimePermission("createClassLoader") или RuntimePermission("getClassLoader") запрещены менеджером безопасности
See Also:
  • 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 Note:
Реализация конкретна в том, является ли создание слоя с помощью этого метода атомарной операцией или нет. Соответственно, возможно, что этот метод завершится неудачей для некоторых модулей, но не для всех, определённых для виртуальной машины Java.
Parameters:
cf - Конфигурация слоя
parentLayers - Список родительских слоёв в порядке поиска
clf - Функция для сопоставления имени модуля с загрузчиком классов
Returns:
Контроллер, управляющий вновь созданным слоем
Throws:
IllegalArgumentException - Если родитель(и) заданной конфигурации не соответствуют конфигурации родительских слоёв, включая порядок
LayerInstantiationException - Если создание слоя завершается неудачей по любой из перечисленных выше причин
SecurityException - Если RuntimePermission("getClassLoader") запрещено менеджером безопасности

configuration

public Configuration configuration()
Возвращает конфигурацию для этого слоя.
Returns:
Конфигурация для этого слоя

parents

public List<ModuleLayer> parents()
Возвращает неизменяемый список родителей этого слоя в порядке поиска. Если это пустой слой, то возвращается пустой список.
Returns:
Возможный пустой неизменяемый список родителей этого слоя

modules

public Set<Module> modules()
Возвращает неизменяемый набор модулей в этом слое.
Returns:
Возможный пустой неизменяемый набор модулей в этом слое

findModule

public Optional<Module> findModule(String name)
Возвращает модуль с заданным именем в этом слое, или, если он не в этом слое, в родительских слоях. Поиск модуля в родительских слоях эквивалентен вызову findModule для каждого родителя в порядке поиска, пока модуль не будет найден или все родители не будут перебраны. В дереве слоёв это эквивалентно поиску в глубину.
Parameters:
name - Имя модуля для поиска
Returns:
Модуль с заданным именем или пустой Optional если в этом слое или любом родительском слое нет модуля с таким именем

findLoader

public ClassLoader findLoader(String name)
Возвращает ClassLoader для модуля с заданным именем. Если модуль с заданным именем отсутствует в этом слое, то ищутся родительские parent слои способом, указанным в findModule.

Если установлен менеджер безопасности, то вызывается его метод checkPermission с разрешением RuntimePermission("getClassLoader") для проверки того, разрешено ли вызывающей стороне получить доступ к загрузчику классов.

API Note:
Этот метод не возвращает Optional<ClassLoader> потому что `null` должен использоваться для представления загрузчика классов Bootstrap.
Parameters:
name - Имя модуля для поиска
Returns:
ClassLoader, которому определён модуль
Throws:
IllegalArgumentException - если модуль с заданным именем не определён в этом слое или в любом родительском слое этого слоя
SecurityException - если запрещено менеджером безопасности

toString

public String toString()
Возвращает строку, описывающую этот слой модулей.
Overrides:
toString в классе Object
Returns:
Возможная пустая строка, описывающая этот слой модулей

empty

public static ModuleLayer empty()
Возвращает пустой слой. В пустом слое нет модулей. У него нет родителей.
Returns:
Пустой слой

boot

public static ModuleLayer boot()
Возвращает слой boot. Слой boot содержит по крайней мере один модуль, java.base. Его родителем является empty слой.
API Note:
Этот метод возвращает null во время запуска и до полного инициализации слоя boot.
Returns:
Слой boot

© 1993, 2021, 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/17/docs/api/java.base/java/lang/ModuleLayer.html

Spec-Zone.ru

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