Spec-Zone.ru › OpenJDK 25

Пакет java.lang.constant

package java.lang.constant
Классы и интерфейсы для представления номинальных дескрипторов сущностей времени выполнения, таких как классы или дескрипторы методов, а также сущностей файлов классов, таких как записи пула констант или точки вызова invokedynamic. Эти классы подходят для использования в API чтения и записи байткода, бутстрапах invokedynamic, API встроенных функций байткода, а также инструментах анализа программ во время компиляции или компоновки.

Каждому API, который читает и записывает инструкции байткода, необходимо моделировать операнды этих инструкций и другие структуры файлов классов (например, записи в таблице методов бутстрапа или карты стека, которые часто ссылаются на записи в пуле констант файла класса). Такие записи могут обозначать значения базовых типов, например строк или целых чисел; части программы, например классы или дескрипторы методов; либо значения произвольных типов, определённых пользователем. Иерархия ConstantDesc предоставляет представление записей пула констант в номинальной форме, удобное для моделирования операндов инструкций байткода в API.

Номинальные дескрипторы

ConstantDesc — это описание значения константы. Такое описание представляет собой номинальную форму значения константы; это не само значение, а скорее «рецепт» для описания значения, его сохранения в записи пула констант или его восстановления в контексте загрузки класса. Каждый ConstantDesc знает, как разрешить себя — вычислить описываемое им значение — с помощью ConstantDesc.resolveConstantDesc. Это позволяет API, принимающему объекты ConstantDesc, вычислять их с помощью рефлексии при условии, что классы и методы, на которые ссылается их номинальное описание, существуют и доступны.

Подтипы ConstantDesc описывают различные виды значений констант. Для каждого типа загружаемой записи пула констант, определённого в JVMS 4.4, существует соответствующий подтип ConstantDesc: ClassDesc, MethodTypeDesc, DirectMethodHandleDesc, String, Integer, Long, Float, Double и DynamicConstantDesc. Эти классы предоставляют методы доступа, специфичные для соответствующего типа, чтобы извлекать номинальную информацию для данного вида константы. Когда API записи байткода встречает ConstantDesc, ему следует определить, к какому из этих типов он относится, привести его к этому типу, извлечь номинальную информацию и сгенерировать соответствующую запись в пуле констант. Когда API чтения байткода встречает запись пула констант, оно может преобразовать её в соответствующий тип номинального дескриптора. Для динамических констант API чтения байткода могут использовать фабричный метод DynamicConstantDesc.ofCanonical, который проверяет бутстрап и для известных бутстрапов возвращает более конкретный подтип DynamicConstantDesc, например Enum.EnumDesc.

Ещё один способ получить номинальное описание значения — запросить его у самого значения. Constable — это тип, значения которого могут описывать себя в номинальной форме как ConstantDesc. Базовые типы, такие как String и Class, реализуют Constable; его также могут реализовывать классы, определённые пользователем. Сущности, создающие файлы классов (например, компиляторы), могут анализировать объекты constable, чтобы получить более эффективный способ представления их значений в файлах классов.

Этот пакет также содержит DynamicCallSiteDesc, представляющий запись пула констант Constant_InvokeDynamic_info, не являющуюся загружаемой. Он описывает метод бутстрапа, имя и тип вызова, а также аргументы бутстрапа, связанные с инструкцией invokedynamic. Он также подходит для описания точек вызова invokedynamic в API чтения и записи байткода.

Другие члены этого пакета — ModuleDesc и PackageDesc. Они представляют структуры сведений о модулях и пакетах и подходят для описания модулей и их содержимого в API чтения и записи байткода.

См. Спецификацию виртуальной машины Java:
4.4 Пул констант
Начиная с версии:
12
Пакет Описание
java.lang
Предоставляет классы, имеющие фундаментальное значение для разработки языка программирования Java.
Класс Описание
ClassDesc
Номинальный дескриптор константы Class.
Constable
Представляет тип, значения которого являются константными.
ConstantDesc
Номинальный дескриптор загружаемого значения константы, определённого в JVMS 4.4.
ConstantDescs
Предопределённые значения номинальных дескрипторов для распространённых констант, включая дескрипторы примитивных типов классов и других распространённых типов платформы, а также дескрипторы дескрипторов методов для стандартных методов бутстрапа.
DirectMethodHandleDesc
Номинальный дескриптор прямого MethodHandle.
DirectMethodHandleDesc.Kind
Виды дескрипторов методов, которые можно описать с помощью DirectMethodHandleDesc.
DynamicCallSiteDesc
Номинальный дескриптор точки вызова invokedynamic.
DynamicConstantDesc<T>
Номинальный дескриптор динамической константы (описанной в пуле констант с помощью Constant_Dynamic_info).
MethodHandleDesc
Номинальный дескриптор константы MethodHandle.
MethodTypeDesc
Номинальный дескриптор константы MethodType.
ModuleDesc
Номинальный дескриптор константы Module.
PackageDesc
Номинальный дескриптор константы Package.

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, обзоры концепций, определения терминов, способы обхода ограничений и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

© 1993, 2025, 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/25/docs/api/java.base/java/lang/constant/package-summary.html

Spec-Zone.ru

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