Spec-Zone.ru › OpenJDK 27

Package java.lang.classfile.constantpool

package java.lang.classfile.constantpool

Предоставляет интерфейсы для описания записей пула констант библиотеки java.lang.classfile.

Пакет java.lang.classfile.constantpool содержит интерфейсы для описания записей пула констант в формате файла class. Записи пула констант — это низкоуровневые модели, точно представляющие структуру файла class.

API этого пакета выполняют проверку аргументов на null и непредставимые значения, если не указано иное.

Чтение записей пула констант

При чтении файлов class записи пула загружаются отложенно; содержимое этих записей, помимо их базовой структуры, не анализируется, чтобы ускорить разбор. Содержимое записей, представляющих интерес для пользователей, обычно доступных через другие модели и элементы, считывается по требованию. Например, для поиска методов сначала следует отфильтровать их по флагам доступа, а затем по имени метода, и использовать Utf8Entry.equalsString(String) вместо проверки равенства с Utf8Entry.stringValue(). Это позволяет свести к минимуму загрузку записей UTF-8:
boolean isStaticWorkMethod(MethodModel method) {
    // check static flag first to avoid unnecessary evaluation of UTF-8 entry
    return (method.flags().flagsMask() & ClassFile.ACC_STATIC) != 0
            // use equalsString to avoid full conversion to String for comparison
            // the Utf8Entry can also act as a basic CharSequence without full conversion
            && method.methodName().equalsString("work");
}

Записи также предоставляют средства доступа к проверенной символьной информации с номинальными абстракциями дескрипторов из пакета java.lang.constant. Эти средства доступа к символьной информации проверяют данные в считанных файлах class и выбрасывают исключение IllegalArgumentException, если доступная запись пула констант содержит недопустимые данные. Номинальные дескрипторы представляют проверенные данные, избавляя пользователей от дополнительных проверок при дальнейшей обработке.

Из-за отложенного характера разбора файлов class исключение IllegalArgumentException, указывающее на повреждённые данные файла class, может быть выброшено при вызове любого метода. Например, исключение может возникнуть при первом чтении ClassEntry из пула констант (из-за недопустимого индекса или неверного типа записи), при раскрытии связанной с ней записи UTF-8 (из-за повреждённых данных UTF-8) или при обращении к символьной информации (если строка недопустима для записи класса).

Запись элементов пула констант

Как правило, при записи файлов class пользователям не нужно беспокоиться о работе с пулом констант и его записями. Большинство моделей и элементов Class-File API имеют два набора фабричных методов: один принимает символьную информацию, представляющую используемые элементы, а другой — записи пула констант. Построитель пула констант, связанный с построителями файлов class, ClassFileBuilder.constantPool(), автоматически создаёт записи пула на основе символьной информации или повторно использует уже существующие. Проверенные данные в символьной информации упрощают создание файлов class, позволяя избежать избыточного разбора необработанных данных записей пула констант.

Разумеется, пользователи могут использовать фабричные методы, принимающие записи пула констант, если записи уже имеются у них или если им нужен более точный контроль над созданием файлов class.

Если при построении класса повторно используется множество моделей и элементов из другого ClassModel, процесс построения может использовать построитель пула констант, расширяющий указанный ClassModel. Такой построитель доступен через ConstantPoolBuilder::of(ClassModel) и позволяет пакетно копировать байтовые данные со ссылками на пул констант, ускоряя построение класса. Это особенно актуально для преобразования классов; управлять таким поведением позволяет ConstantPoolSharingOption.

См. Спецификацию виртуальной машины Java:
4.4 Пул констант
Начиная с версии:
24
Пакет Описание
java.lang.classfile
Предоставляет библиотеку для разбора, создания и преобразования файлов классов.
java.lang.classfile.attribute
Предоставляет интерфейсы для описания атрибутов файлов class библиотеки java.lang.classfile.
java.lang.classfile.instruction
Предоставляет интерфейсы для описания инструкций кода библиотеки java.lang.classfile.
Класс Описание
AnnotationConstantValueEntry
Маркерный интерфейс для записей пула констант, представляющих константные значения, связанные с элементами аннотаций.
ClassEntry
Моделирует структуру CONSTANT_Class_info, представляющую ссылочный тип в пуле констант файла class.
ConstantDynamicEntry
Моделирует структуру CONSTANT_Dynamic_info, представляющую динамически вычисляемую константу в пуле констант файла class.
ConstantPool
Предоставляет доступ для чтения к пулу констант и таблице методов начальной загрузки файла class.
ConstantPoolBuilder
Построитель пула констант файла class.
ConstantPoolException
Выбрасывается, если запрошенную запись не удаётся получить из пула констант или таблицы методов начальной загрузки.
ConstantValueEntry
Маркерный интерфейс для записей пула констант, представляющих константные значения в атрибуте ConstantValue.
DoubleEntry
Моделирует структуру CONSTANT_Double_info, представляющую константу double в пуле констант файла class.
DynamicConstantPoolEntry
Суперинтерфейс, моделирующий динамически вычисляемые записи пула констант, включая ConstantDynamicEntry и InvokeDynamicEntry, в пуле констант файла class.
FieldRefEntry
Моделирует структуру CONSTANT_Fieldref_info или символьную ссылку на поле в пуле констант файла class.
FloatEntry
Моделирует структуру CONSTANT_Float_info или константу float в пуле констант файла class.
IntegerEntry
Моделирует структуру CONSTANT_Integer_info или константу int в пуле констант файла class.
InterfaceMethodRefEntry
Моделирует структуру CONSTANT_InterfaceMethodRef_info или символьную ссылку на метод интерфейса в пуле констант файла class.
InvokeDynamicEntry
Моделирует структуру CONSTANT_InvokeDynamic_info или символьную ссылку на динамически вычисляемую точку вызова в пуле констант файла class.
LoadableConstantEntry
Маркерный интерфейс для записей пула констант, которые можно загрузить с помощью инструкций ldc.
LongEntry
Моделирует структуру CONSTANT_Long_info или константу long в пуле констант файла class.
MemberRefEntry
Суперинтерфейс, моделирующий символьные ссылки на член класса или интерфейса в пуле констант файла class, включая ссылки на поля, методы класса и методы интерфейса.
MethodHandleEntry
Моделирует структуру CONSTANT_MethodHandle_info или символьную ссылку на дескриптор метода в пуле констант файла class.
MethodRefEntry
Моделирует структуру CONSTANT_MethodRef_info или символьную ссылку на метод класса в пуле констант файла class.
MethodTypeEntry
Моделирует структуру CONSTANT_MethodType_info или символьную ссылку на тип метода в пуле констант файла class.
ModuleEntry
Моделирует структуру CONSTANT_Module_info, обозначающую модуль в пуле констант файла class.
NameAndTypeEntry
Моделирует структуру CONSTANT_NameAndType_info, представляющую поле или метод в пуле констант файла class.
PackageEntry
Моделирует CONSTANT_Package_info, представляющую пакет в пуле констант файла class.
PoolEntry
Моделирует запись в пуле констант файла class.
StringEntry
Моделирует структуру CONSTANT_String_info или строковую константу в пуле констант файла class.
Utf8Entry
Моделирует константу CONSTANT_UTF8_info, представляющую строки в пуле констант файла class.

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в документации Java SE, содержащей более подробные описания для разработчиков, обзоры концепций, определения терминов, обходные решения и примеры работающего кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2026, 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.

Spec-Zone.ru

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