Spec-Zone.ru › OpenJDK 24

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

package 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
См. также:
  • Attribute
  • AttributeMapper
  • Attributes
Пакет Описание
java.lang.classfile
Предоставляет библиотеку для разбора, генерации и преобразования файлов class.
java.lang.classfile.constantpool
Предоставляет интерфейсы, описывающие записи константного пула для библиотеки java.lang.classfile.
java.lang.classfile.instruction
Предоставляет интерфейсы, описывающие инструкции кода для библиотеки java.lang.classfile.
Класс Описание
AnnotationDefaultAttribute
Моделирует атрибут AnnotationDefault (JVMS 4.7.22), который записывает значение по умолчанию (JLS 9.6.2) для элемента интерфейса аннотации, определенного этим методом.
BootstrapMethodsAttribute
Моделирует атрибут BootstrapMethods (JVMS 4.7.23), который хранит символическую информацию для выполнения методов-загрузчиков, используемых динамически вычисляемыми местами вызова и константами.
CharacterRangeInfo
Моделирует запись одного диапазона символов в CharacterRangeTableAttribute.
CharacterRangeTableAttribute
Моделирует атрибут CharacterRangeTable, который представляет собой двустороннее отображение диапазонов позиций в исходном файле на диапазоны индексов в массиве code.
CodeAttribute
Моделирует атрибут Code (JVMS 4.7.3), который содержит байт-код этого метода.
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), который может появляться в классах, которые представляют описатели модулей, чтобы указать пакеты в модуле, используемые описателем модуля.
END_OF_DOCUMENT_MARKER
ModuleProvideInfo
Моделирует объявление "provides" в ModuleAttribute.
ModuleRequireInfo
Моделирует объявление "requires" в ModuleAttribute.
ModuleResolutionAttribute
Моделирует атрибут ModuleResolution, который может появляться на классах, представляющих модульные описатели (представляющих) для захвата метаданных разрешения модулей.
ModuleTargetAttribute
Моделирует атрибут ModuleTarget, который может появляться на классах, представляющих модульные описатели (представляющих) для представления ограничений целевой платформы.
NestHostAttribute
Моделирует атрибут NestHost (JVMS 4.7.28), который указывает, что этот класс является членом гнезда и хост-классом этого гнезда.
NestMembersAttribute
Моделирует атрибут NestMembers (JVMS 4.7.29), который указывает, что этот класс является хостом гнезда и другими членами гнезда.
PermittedSubclassesAttribute
Моделирует атрибут PermittedSubclasses (JVMS 4.7.31), который указывает, что этот класс или интерфейс запечатан, и какие классы или интерфейсы могут расширять или реализовывать этот класс или интерфейс.
RecordAttribute
Моделирует атрибут Record (JVMS 4.7.30), который указывает, что этот класс является классом-записью и компонентами записи.
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
Моделирует атрибут Signature (JVMS 4.7.9), который указывает обобщенную сигнатуру этой структуры.
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
Моделирует атрибут Synthetic (JVMS 4.7.8), который отмечает член класса как артефакты, специфичные для реализации.
END_OF_DOCUMENT_MARKER
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

Spec-Zone.ru

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