Spec-Zone.ru › OpenJDK 25

Пакет java.lang.classfile.constantpool

package java.lang.classfile.constantpool

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

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

Если не указано иное, передача null или массива либо коллекции, содержащей элемент null, в качестве аргумента конструктору или методу любого класса или интерфейса Class-File API приводит к выбрасыванию NullPointerException.

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

При чтении файлов 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, 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/classfile/constantpool/package-summary.html

Spec-Zone.ru

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