Spec-Zone.ru › OpenJDK 25

Пакет 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 файлов классов приведёт к выбрасыванию NullPointerException.

Чтение атрибутов

Обычно атрибуты получают через AttributedElement. Кроме того, многие атрибуты реализуют ClassElement, FieldElement, MethodElement или CodeElement; как правило, такие атрибуты предоставляются, когда их содержащие элементы рассматриваются как CompoundElementы при потоковом обходе, если не указано иное.

При чтении файлов class атрибуты разворачиваются лениво; содержимое этих атрибутов не вычисляется для ускорения синтаксического разбора. Пользовательские атрибуты из AttributeMapper.readAttribute(AttributedElement, 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
Предоставляет библиотеку для разбора, создания и преобразования файлов классов.
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), который может присутствовать в классах, представляющих дескрипторы модулей, и указывает пакеты модуля, используемые дескриптором модуля.
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), помечающий член класса как артефакт, специфичный для реализации.
UnknownAttribute
Представляет неизвестный атрибут, считанный из файла 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/attribute/package-summary.html

Spec-Zone.ru

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