Пакет 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
- См. также:
| Класс | Описание |
|---|---|
| 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.