Пакет 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
- См. также:
| Класс | Описание |
|---|---|
| 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://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/classfile/attribute/package-summary.html