パッケージ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)のスタック・マップ・フレームをモデル化します。オブジェクト型のスタック値。単純なスタック値。初期化されていないスタック値。スタックまたはローカル変数値のタイプ。StackMapTable属性(JVMS 4.7.4)をモデル化します。(4.10.1)型チェックによる検証に使用されます(4.10.1)。classファイルから読み取られた不明な属性をモデル化します。