Пакет java.lang.classfile.attribute
Предоставляет интерфейсы, описывающие атрибуты файлов class для библиотеки java.lang.classfile.
Пакет java.lang.classfile.attribute содержит интерфейсы, описывающие конкретные атрибуты файлов class, включая предопределённые (JVMS 4.7) и специфичные для JDK нестандартные атрибуты, отображения которых определены в Attributes. Данное описание пакета предоставляет обзор системы атрибутов файлов class, включая Attribute, AttributedElement, AttributeMapper и CustomAttribute, которые не находятся в этом пакете. Если не указано иное, передача null или массива или коллекции, содержащей элемент null, в качестве аргумента конструктору или методу любого класса или интерфейса API файлов Class-File приведёт к исключению NullPointerException.
Чтение атрибутов
Общий способ получения атрибутов — черезAttributedElement. Кроме того, многие атрибуты реализуют ClassElement, FieldElement, MethodElement или CodeElement, и эти атрибуты обычно предоставляются, когда их содержащие элементы рассматриваются как CompoundElement при потоковой обработке, если не указано иное. При чтении из файлов class атрибуты загружаются лениво; содержимое этих атрибутов не вычисляется для ускорения разбора, а атрибуты, определённые пользователем из AttributeMapper.readAttribute(java.lang.classfile.AttributedElement, java.lang.classfile.ClassReader, int), также должны быть ленивыми. Содержимое, представляющее интерес для пользователя, может считываться по требованию, поэтому ошибки в одном атрибуте не препятствуют доступу к другим атрибутам.
Содержимое атрибутов представлено записями константного пула для точного отображения исходного файла class. Эти записи предоставляют методы преобразования для отображения их как валидированных символьных описателей. Обратитесь к java.lang.classfile.constantpool для эффективного чтения записей константного пула, которые могут также влиять на скорость чтения атрибутов. Рассмотрите этот пример проверки наличия аннотации Deprecated:
private static final String DEPRECATED_DESC = Deprecated.class.descriptorString();
static boolean hasDeprecated(AttributedElement element) {
var annotations = element.findAttribute(Attributes.runtimeVisibleAnnotations())
.map(RuntimeVisibleAnnotationsAttribute::annotations)
.orElse(List.of());
for (var anno : annotations) {
// equalsString reduces extra computations for raw UTF-8 entries
if (anno.className().equalsString(DEPRECATED_DESC)) {
return true;
}
}
return false;
}
Из-за ленивой природы разбора файлов class, исключение IllegalArgumentException, указывающее на неправильно сформированные данные файла class, может быть вызвано при любом вызове метода, как из самого атрибута из-за структурной порчи, так и из записи константного пула, на которую ссылается атрибут. Некоторые атрибуты, такие как атрибуты аннотаций, должны быть проигнорированы, если они некорректны согласно JVMS; в результате код обработки атрибутов должен предвидеть IllegalArgumentException и пропустить атрибуты, вместо того чтобы распространять ошибку.
Запись атрибутов
Большинство атрибутов реализуют по меньшей мере один из интерфейсовClassElement, FieldElement, MethodElement или CodeElement, поэтому их можно передать соответствующему ClassFileBuilder для записи в качестве части этих структур. Атрибуты определяют, могут ли они появляться несколько раз в одной структуре; если нет, то последний экземпляр атрибута, переданный в билдер, записывается в конечную структуру. Некоторые атрибуты, такие как BootstrapMethodsAttribute, не реализуют ни один из этих интерфейсов. Они создаются другими способами, указанными в моделирующем интерфейсе для каждого атрибута. Атрибуты для RecordComponentInfo предоставляются через методы фабрики. Фабрики атрибутов, как правило, имеют два набора методов фабрики: один, принимающий символическую информацию, представляющую использование, и другой, принимающий записи константного пула. В большинстве случаев символические фабрики достаточны, но фабрики на основе записей константного пула могут использоваться для точного управления генерацией файла class; см. "Запись записей константного пула" для получения дополнительной информации.
Многие атрибуты могут быть скопированы в блоке, если зависящие от них данные не изменяются; эта информация раскрывается в AttributeMapper.stability() и документируется для каждого атрибута в его интерфейсе моделирования. Возможность копирования в блоке может значительно ускорить генерацию или преобразование файла class. Кроме того, в сочетании с ClassFile.AttributesProcessingOption, атрибуты, прочитанные из других файлов class, которые не могут подтвердить, что их данные по-прежнему актуальны для текущего создаваемого файла class, могут быть пропущены.
- См. Спецификацию виртуальной машины Java:
- 4.7 Атрибуты
- С момента:
- 24
- См. также:
| Класс | Описание |
|---|---|
| AnnotationDefaultAttribute | Моделирует атрибут AnnotationDefault (JVMS 4.7.22), который записывает значение по умолчанию (JLS 9.6.2) для элемента интерфейса аннотации, определенного этим методом. |
| BootstrapMethodsAttribute | Моделирует атрибут BootstrapMethods (JVMS 4.7.23), который хранит символическую информацию для выполнения методов-загрузчиков, используемых динамически вычисляемыми местами вызова и константами. |
| CharacterRangeInfo | Моделирует запись одного диапазона символов в CharacterRangeTableAttribute. |
| CharacterRangeTableAttribute | Моделирует атрибут CharacterRangeTable, который представляет собой двустороннее отображение диапазонов позиций в исходном файле на диапазоны индексов в массиве code. |
| CodeAttribute | |
| CompilationIDAttribute | Моделирует атрибут CompilationID, который записывает время компиляции файла class. |
| ConstantValueAttribute | Моделирует атрибут ConstantValue (JVMS 4.7.2), который указывает, что значение этого поля является константой, и эту константу. |
| DeprecatedAttribute | Моделирует атрибут Deprecated (JVMS 4.7.15), который указывает, что эта структура устарела. |
| EnclosingMethodAttribute | Моделирует атрибут EnclosingMethod (JVMS 4.7.7), который указывает, что этот класс является локальным или анонимным классом, и указывает метод или конструктор, содержащий этот класс, если этот класс заключен ровно в один метод или конструктор. |
| ExceptionsAttribute | Моделирует атрибут Exceptions (JVMS 4.7.5), который записывает исключения, которые объявлены для выбрасывания этим методом. |
| InnerClassesAttribute | Моделирует атрибут InnerClasses (JVMS 4.7.6), который записывает, какие классы, на которые ссылается этот файл class, являются вложенными классами. |
| InnerClassInfo | Моделирует отдельную запись в InnerClassesAttribute. |
| LineNumberInfo | Моделирует отдельную запись номера строки в LineNumberTableAttribute. |
| LineNumberTableAttribute | Моделирует атрибут LineNumberTable (JVMS 4.7.12), который записывает отображение между индексами в массиве code и номерами строк в исходном файле. |
| LocalVariableInfo | Моделирует отдельную локальную переменную в LocalVariableTableAttribute. |
| LocalVariableTableAttribute | Моделирует атрибут LocalVariableTable (JVMS 4.7.13), который записывает отладочную информацию о локальных переменных. |
| LocalVariableTypeInfo | Моделирует отдельную локальную переменную в LocalVariableTypeTableAttribute. |
| LocalVariableTypeTableAttribute | Моделирует атрибут LocalVariableTypeTable (JVMS 4.7.14), который записывает отладочную информацию о локальных переменных с параметрическими типами. |
| MethodParameterInfo | Моделирует отдельную параметр метода в MethodParametersAttribute. |
| MethodParametersAttribute | Моделирует атрибут MethodParameters (JVMS 4.7.24), который записывает рефлексивную информацию о параметрах этого метода, таких как модификаторы доступа. |
| ModuleAttribute | Моделирует атрибут Module (JVMS 4.7.25), который всегда появляется в классах, которые представляют описатели модулей. |
| ModuleAttribute.ModuleAttributeBuilder | Построитель атрибутов Module. |
| ModuleExportInfo | Моделирует отдельное объявление "exports" в ModuleAttribute. |
| ModuleHashesAttribute | Моделирует атрибут ModuleHashes, который появляется в классах, которые представляют описатели модулей, чтобы захватить хэши набора сопутствующих модулей. |
| ModuleHashInfo | Моделирует информацию о хэше для отдельного модуля в ModuleHashesAttribute. |
| ModuleMainClassAttribute | Моделирует атрибут ModuleMainClass (JVMS 4.7.27), который появляется в классах, которые представляют описатели модулей, чтобы указать главный класс модуля. |
| ModuleOpenInfo | Моделирует отдельное объявление "opens" в ModuleAttribute. |
| ModulePackagesAttribute | Моделирует атрибут ModulePackages (JVMS 4.7.26), который может появляться в классах, которые представляют описатели модулей, чтобы указать пакеты в модуле, используемые описателем модуля. |
| ModuleProvideInfo | Моделирует объявление "provides" в ModuleAttribute. |
| ModuleRequireInfo | Моделирует объявление "requires" в ModuleAttribute. |
| ModuleResolutionAttribute | Моделирует атрибут ModuleResolution, который может появляться на классах, представляющих модульные описатели (представляющих) для захвата метаданных разрешения модулей. |
| ModuleTargetAttribute | Моделирует атрибут ModuleTarget, который может появляться на классах, представляющих модульные описатели (представляющих) для представления ограничений целевой платформы. |
| NestHostAttribute | |
| NestMembersAttribute | Моделирует атрибут NestMembers (JVMS 4.7.29), который указывает, что этот класс является хостом гнезда и другими членами гнезда. |
| PermittedSubclassesAttribute | Моделирует атрибут PermittedSubclasses (JVMS 4.7.31), который указывает, что этот класс или интерфейс запечатан, и какие классы или интерфейсы могут расширять или реализовывать этот класс или интерфейс. |
| RecordAttribute | |
| RecordComponentInfo | Моделирует отдельный компонент записи в RecordAttribute. |
| RuntimeInvisibleAnnotationsAttribute | Моделирует атрибут RuntimeInvisibleAnnotations (JVMS 4.7.17), который хранит аннотации объявления на этой структуре, видимые для потребителей файлов
class, но невидимые для ядерного отражения. |
| RuntimeInvisibleParameterAnnotationsAttribute | Моделирует атрибут RuntimeInvisibleParameterAnnotations (JVMS 4.7.19), который хранит аннотации объявления параметров метода этого метода, видимые для потребителей файлов class, но невидимые для ядерного отражения. |
| RuntimeInvisibleTypeAnnotationsAttribute | Моделирует атрибут RuntimeInvisibleTypeAnnotations (JVMS 4.7.21), который хранит аннотации использования типа для аннотированных применений типов в этой структуре, видимые для потребителей файлов class, но невидимые для ядерного отражения. |
| RuntimeVisibleAnnotationsAttribute | Моделирует атрибут RuntimeVisibleAnnotations (JVMS 4.7.16), который хранит аннотации объявления на этой структуре, видимые для потребителей файлов class и ядерного отражения. |
| RuntimeVisibleParameterAnnotationsAttribute | Моделирует атрибут RuntimeVisibleParameterAnnotations (JVMS 4.7.18), который хранит аннотации объявления параметров метода этого метода, видимые для потребителей файлов class и ядерного отражения. |
| RuntimeVisibleTypeAnnotationsAttribute | Моделирует атрибут RuntimeVisibleTypeAnnotations (JVMS 4.7.20), который хранит аннотации использования типа для аннотированных применений типов в этой структуре, видимые для потребителей файлов class и ядерного отражения. |
| SignatureAttribute | |
| SourceDebugExtensionAttribute | Моделирует атрибут SourceDebugExtension (JVMS 4.7.11), который хранит произвольные данные в формате модифицированной UTF-8. |
| SourceFileAttribute | Моделирует атрибут SourceFile (JVMS 4.7.10), который указывает имя файла исходного кода, из которого был скомпилирован этот
class файл. |
| SourceIDAttribute | Моделирует атрибут SourceID, который записывает время последней модификации исходного файла, из которого был скомпилирован этот class файл. |
| StackMapFrameInfo | Моделирует кадр карты стека в атрибуте StackMapTable (JVMS 4.7.4). |
| StackMapFrameInfo.ObjectVerificationTypeInfo | Значение стека для типа объекта. |
| StackMapFrameInfo.SimpleVerificationTypeInfo | Простое значение стека. |
| StackMapFrameInfo.UninitializedVerificationTypeInfo | Неинициализированное значение стека. |
| StackMapFrameInfo.VerificationTypeInfo | Тип значения стека или локальной переменной. |
| StackMapTableAttribute | Моделирует атрибут StackMapTable (JVMS 4.7.4), который используется для проверки с помощью проверки типов (4.10.1). |
| SyntheticAttribute |
| UnknownAttribute | Моделирует неизвестный атрибут, считанный из 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/attribute/package-summary.html