Пакет java.lang.classfile.constantpool
Предоставляет интерфейсы, описывающие записи постоянного пула для библиотеки java.lang.classfile.
The java.lang.classfile.constantpool пакет содержит интерфейсы, описывающие записи постоянного пула в формате файла class. Записи постоянного пула — это низкоуровневые модели, точно отражающие точную структуру файла class. Если не указано иное, передача null или массива или коллекции, содержащей элемент null, в качестве аргумента конструктору или методу любого класса или интерфейса API файлов Class-File вызовет исключение 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. Большинство моделей и элементов API файлов Class-File имеют два набора фабричных методов: один, принимающий символьные данные, представляющие использование, и другой, принимающий записи постоянного пула. Генератор постоянного пула, связанный с генераторами файлов 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 | Обеспечивает чтение доступа к константному пулу и таблице методов bootstrap файла class. |
| ConstantPoolBuilder | Библиотека для построения константного пула файла class. |
| ConstantPoolException | Бросается для указания того, что запрошенная запись не может быть получена из константного пула или таблицы методов bootstrap. |
| 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/classfile/constantpool/package-summary.html