パッケージjava.lang.classfile.attribute
java.lang.classfile
ライブラリのclass
ファイル属性を記述するインタフェースを提供します。
java.lang.classfile.attribute
パッケージには、事前定義済の(JVMS 4.7)およびJDK固有の非標準属性(マッパーはAttributes
で定義)など、特定のclass
ファイル属性を記述するインタフェースが含まれています。 このパッケージ・サマリーは、Attribute
、AttributedElement
、AttributeMapper
、CustomAttribute
など、このパッケージに存在しないclass
ファイル属性システムの概要を示します。
特に指定がないかぎり、null
またはnull
要素を含む配列またはコレクションを引数としてクラス・ファイルAPIクラスまたはインタフェースのコンストラクタまたはメソッドに渡すと、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
ファイルの解析が遅延しているため、構造的な破損が原因で属性自体から、または属性によって参照される一定のプール・エントリから、不正な形式のclass
ファイル・データを示すIllegalArgumentException
をメソッド起動時にスローできます。 注釈属性などの一部の属性は、JVMSごとに不正な形式である場合は、暗黙的に無視する必要があります。その結果、属性処理コードでは、このような属性で失敗を伝播するのではなく、IllegalArgumentException
を予測してスキップする必要があります。
属性の記述
ほとんどの属性は、ClassElement
、FieldElement
、MethodElement
またはCodeElement
の少なくとも1つを実装しているため、これらの構造の一部として書き込まれるそれぞれのClassFileBuilder
に送信できます。 属性は、1つの構造で「複数回表示される」できるかどうかを定義します。できない場合は、ビルダーに提供される最後の属性インスタンスが最終構造に書き込まれます。 BootstrapMethodsAttribute
などの一部の属性は、これらのインタフェースを実装しません。 これらは、各属性のモデリング・インタフェースで指定される他の方法で作成されます。 RecordComponentInfo
の属性は、ファクトリ・メソッドを介して提供されます。
通常、属性ファクトリには2つのファクトリ・メソッド・セットがあります: 使用を表すシンボリック情報、および定数プール・エントリを受け入れるシンボリック情報を受け入れるもの。 ほとんどの場合、シンボリック・ファクトリは十分ですが、定数プール・エントリ・エントリは、class
ファイルの生成に対するファイングレイン制御に使用できます。詳細は、「定数プール・エントリの書き込み」を参照してください。
依存するデータが変更されない場合、多くの属性を一括コピーできます。この情報はAttributeMapper.stability()
で公開され、各属性についてモデリング・インタフェースで文書化されます。 一括コピー機能により、class
ファイルの生成または変換が大幅に高速化されます。 また、ClassFile.AttributesProcessingOption
とともに、データを確認できない他のclass
ファイルから読み取られた属性が、現在構築中のclass
ファイルに対して有効であることは、削除される可能性があります。
- Java Virtual Machine仕様を参照してください:
-
4.7 属性
- 導入されたバージョン:
- 24
- 関連項目:
-
クラス説明このメソッドで定義された注釈インタフェース要素のデフォルト値(JLS 9.6.2)を記録する、
AnnotationDefault
属性(JVMS 4.7.22)をモデル化します。BootstrapMethods
属性(JVMS 4.7.23)をモデル化します。この属性には、動的に計算されるコール・サイトおよび定数で使用されるブートストラップ・メソッドの実行に関するシンボリック情報が格納されます。CharacterRangeTableAttribute
内の単一の文字範囲エントリをモデル化します。CharacterRangeTable
属性をモデル化します。これは、ソース・ファイルの位置の範囲からcode
配列への索引の範囲への双方向マッピングです。class
ファイルのコンパイル時間を記録するCompilationID
属性をモデル化します。ConstantValue
属性(JVMS 4.7.2)をモデル化します。これは、このフィールドの値が定数であり、その定数値であることを示します。この構造が置き換えられたことを示すDeprecated
属性(JVMS 4.7.15)をモデル化します。EnclosingMethod
属性(JVMS 4.7.7)をモデル化します。これは、このクラスがローカル・クラスまたは匿名クラスであることを示し、このクラスが1つのメソッドまたはコンストラクタで囲まれている場合は、このクラスの包含メソッドまたはコンストラクタを示します。Exceptions
属性(JVMS 4.7.5)をモデル化します。この属性には、このメソッドによってスローされるよう宣言された例外が記録されます。InnerClasses
属性(JVMS 4.7.6)をモデル化します。この属性では、このclass
ファイルによって参照されるクラスがネストされたクラスであることを記録します。InnerClassesAttribute
内の単一のエントリをモデル化します。LineNumberTableAttribute
内の単一の行番号エントリをモデル化します。LineNumberTable
属性(JVMS 4.7.12)をモデル化します。この属性では、索引間のマッピングがcode
配列に、行番号がソース・ファイルに記録されます。LocalVariableTableAttribute
内の単一のローカル変数をモデル化します。ローカル変数に関するデバッグ情報を記録するLocalVariableTable
属性(JVMS 4.7.13)をモデル化します。LocalVariableTypeTableAttribute
内の単一のローカル変数をモデル化します。汎用型を持つローカル変数に関するデバッグ情報を記録するLocalVariableTypeTable
属性(JVMS 4.7.14)をモデル化します。MethodParametersAttribute
で単一のメソッド・パラメータをモデル化します。MethodParameters
属性(JVMS 4.7.24)をモデル化します。この属性には、アクセス修飾子など、このメソッドのパラメータに関する反射情報が記録されます。Module
属性のビルダー。ModuleAttribute
の単一の"exports"宣言をモデル化します。ModuleHashes
属性をモデル化します。この属性は、モジュール記述子を「表す」クラス上に表示され、一連の共通配信モジュールのハッシュを取得します。ModuleHashesAttribute
内の単一モジュールのハッシュ情報をモデル化します。ModuleMainClass
属性(JVMS 4.7.27)をモデル化します。この属性は、モジュールのメイン・クラスを示し、モジュール記述子を「表す」クラス上に表示されます。ModuleAttribute
の単一の"opens"宣言をモデル化します。ModulePackages
属性(JVMS 4.7.26)をモデル化します。この属性は、モジュール記述子を「表す」クラスに配置でき、モジュール記述子で使用されるモジュール内のパッケージを示します。ModuleAttribute
の単一の"provides"宣言をモデル化します。ModuleAttribute
の単一の"requires"宣言をモデル化します。ModuleResolution
属性をモデル化します。この属性は、モジュール記述子を「表す」クラス上に表示され、モジュールの解決メタデータを取得します。ModuleTarget
属性をモデル化します。この属性は、ターゲット・プラットフォームの制約を表すために、モジュール記述子「表す」のクラスに指定できます。NestMembers
属性(JVMS 4.7.29)をモデル化します。これは、このクラスがネストおよび他のネスト・メンバーのホストであることを示します。このクラスまたはインタフェースがsealedであること、およびこのクラスまたはインタフェースを拡張または実装できるクラスまたはインタフェースを示すPermittedSubclasses
属性(JVMS 4.7.31)をモデル化します。RecordAttribute
の単一のレコード・コンポーネントをモデル化します。RuntimeInvisibleAnnotations
属性(JVMS 4.7.17)をモデル化します。この属性には、class
ファイル・コンシューマには表示されるが、「コア反射」には表示されない宣言注釈が格納されます。RuntimeInvisibleParameterAnnotations
属性(JVMS 4.7.19)をモデル化します。この属性には、class
ファイル・コンシューマには表示されるが、「コア反射」には表示されない、このメソッドのメソッド・パラメータに宣言注釈が格納されます。RuntimeInvisibleTypeAnnotations
属性(JVMS 4.7.21)をモデル化します。この属性には、class
ファイル・コンシューマには表示されるが、「コア反射」には表示されない、この構造内の型の注釈付き使用用の注釈が格納されます。RuntimeVisibleAnnotations
属性(JVMS 4.7.16)をモデル化します。この属性には、class
ファイル・コンシューマと「コア反射」の両方に表示される宣言注釈が格納されます。RuntimeVisibleParameterAnnotations
属性(JVMS 4.7.18)をモデル化します。この属性には、class
ファイル・コンシューマと「コア反射」の両方に表示される、このメソッドのメソッド・パラメータに宣言注釈が格納されます。RuntimeVisibleTypeAnnotations
属性(JVMS 4.7.20)をモデル化します。この属性には、class
ファイル・コンシューマと「コア反射」の両方に表示される、この構造内の型の注釈付き使用のためのタイプ使用注釈が格納されます。任意の「変更されたUTF-8」データを格納するSourceDebugExtension
属性(JVMS 4.7.11)をモデル化します。SourceFile
属性(JVMS 4.7.10)をモデル化します。これは、このclass
ファイルのコンパイル元のソース・ファイルの名前を示します。SourceID
属性をモデル化します。この属性には、このclass
ファイルがコンパイルされたソース・ファイルの最終変更時間が記録されます。StackMapTable
属性(JVMS 4.7.4)のスタック・マップ・フレームをモデル化します。オブジェクト型のスタック値。単純なスタック値。初期化されていないスタック値。スタックまたはローカル変数値のタイプ。(4.10.1)型チェックによる検証に使用されるStackMapTable
属性(JVMS 4.7.4)をモデル化します。class
ファイルから読み取られた不明な属性をモデル化します。