Пакет 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
| Класс | Описание |
|---|---|
| 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. |
© 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