Spec-Zone.ru › OpenJDK 27

Пакет 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, которые не входят в этот пакет.

API этого пакета выполняют проверку аргументов на null и непредставимые значения, если не указано иное.

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

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

При чтении из файлов 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, 2026, 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.

Spec-Zone.ru

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