このドキュメントでは、Java SE 14のプレビュー機能であるJava言語のレコードをサポートするためのJava仮想マシン仕様の変更について説明します。 この機能の概要については、「JEP 359」を参照してください。
コンパニオン・ドキュメントでは、レコードをサポートするためにJava言語仕様に必要な変更について説明します。
変更は、JVM仕様の既存のセクションに関して説明します。 新しいテキストはこのように示され、削除されたテキストはこのように示されます。 必要に応じて、説明と考察が端の方にグレーのボックスで囲まれて記載されています。
第4章: classファイル形式
4.7 属性
属性は、classファイル形式のClassFile、field_info、method_info、およびCode_attributeおよびrecord_component_info構造体で使用されます(4.1、4.5、4.6、4.7.3、4.7.30)。
すべての属性が次の一般的な形式を持ちます。
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
すべての属性について、attribute_name_index項目は、クラスの定数プールに対して有効な符号なし16ビット索引である必要があります。 attribute_name_indexでのconstant_poolエントリは、属性の名前を表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。 attribute_length項目の値は、後続の情報の長さをバイト単位で示します。 この長さには、attribute_name_indexおよびattribute_length項目を含む先頭の6バイトは含まれません。
2829の属性がこの仕様によって事前に定義されています。 これらは、ナビゲートしやすいように3回に分けてリストされています。
表4.7-Aは、この章の属性のセクション番号で順序付けられています。 各属性は、それが定義された
classファイル形式の最初のバージョンで示されています。 もう1つ示されているのは、classファイル形式のそのバージョンを導入したJava SEプラットフォームのバージョンです(4.1)。表4.7-Bは、各属性が定義された
classファイル形式の最初のバージョンで順序付けられています。表4.7-Cは、各属性の出現が定義されている
classファイル内の場所で順序付けられています。
この仕様でのこれらの使用状況、つまり、これらが出現するclassファイル構造体のattributes表において、これらの事前定義済の属性の名前が予約されています。
attributes表内における事前定義済の属性の存在に関する条件は、属性を説明するセクションで明示的に規定されています。 条件が規定されていない場合、属性はattributes表内に任意の回数出現する場合があります。
事前定義済の属性は、その目的に応じて3つのグループに分類されます。
Java仮想マシンによる
classファイルの正しい解釈には、6つの属性が不可欠です。ConstantValueCodeStackMapTableBootstrapMethodsNestHostNestMembers
バージョン番号がvである
classファイル内では、Java仮想マシンの実装がclassファイル形式のバージョンvをサポートしており、属性がclassファイル形式のバージョンv以前で最初に定義されたもので、その属性が出現先として定義されている場所に出現している場合、これらの各属性はJava仮想マシンの実装によって識別され、適切に読み取られます。9つ10の属性は、Java仮想マシンによるclassファイルの正しい解釈に不可欠ではありませんが、Java SEプラットフォームのクラス・ライブラリによるclassファイルの正しい解釈に不可欠であるか、ツールの役に立ちます(この場合、属性を規定するセクションは「オプション」として記載されています)。ExceptionsInnerClassesEnclosingMethodSyntheticSignatureSourceFileLineNumberTableLocalVariableTableLocalVariableTypeTableRecord
バージョン番号がvである
classファイル内では、Java仮想マシンの実装がclassファイル形式のバージョンvをサポートしており、属性がclassファイル形式のバージョンv以前で最初に定義されたもので、その属性が出現先として定義されている場所に出現している場合、これらの各属性はJava仮想マシンの実装によって識別され、適切に読み取られます。13の属性は、Java仮想マシンによる
classファイルの正しい解釈に不可欠ではありませんが、Java SEプラットフォームのクラス・ライブラリによって公開されるclassファイルに関するメタデータを含むか、ツールによって使用可能になります(この場合、属性を規定するセクションは「オプション」として記載されています)。SourceDebugExtensionDeprecatedRuntimeVisibleAnnotationsRuntimeInvisibleAnnotationsRuntimeVisibleParameterAnnotationsRuntimeInvisibleParameterAnnotationsRuntimeVisibleTypeAnnotationsRuntimeInvisibleTypeAnnotationsAnnotationDefaultMethodParametersModuleModulePackagesModuleMainClass
Java仮想マシンの実装では、これらの属性に含まれる情報が使用される場合がありますが、そうでない場合、これらの属性は内部で無視する必要があります。
表4.7-A. 事前定義済のclassファイル属性(セクション別)
| 属性 | セクション | classファイル |
Java SE |
|---|---|---|---|
ConstantValue |
4.7.2 | 45.3 | 1.0.2 |
Code |
4.7.3 | 45.3 | 1.0.2 |
StackMapTable |
4.7.4 | 50.0 | 6 |
Exceptions |
4.7.5 | 45.3 | 1.0.2 |
InnerClasses |
4.7.6 | 45.3 | 1.1 |
EnclosingMethod |
4.7.7 | 49.0 | 5.0 |
Synthetic |
4.7.8 | 45.3 | 1.1 |
Signature |
4.7.9 | 49.0 | 5.0 |
SourceFile |
4.7.10 | 45.3 | 1.0.2 |
SourceDebugExtension |
4.7.11 | 49.0 | 5.0 |
LineNumberTable |
4.7.12 | 45.3 | 1.0.2 |
LocalVariableTable |
4.7.13 | 45.3 | 1.0.2 |
LocalVariableTypeTable |
4.7.14 | 49.0 | 5.0 |
Deprecated |
4.7.15 | 45.3 | 1.1 |
RuntimeVisibleAnnotations |
4.7.16 | 49.0 | 5.0 |
RuntimeInvisibleAnnotations |
4.7.17 | 49.0 | 5.0 |
RuntimeVisibleParameterAnnotations |
4.7.18 | 49.0 | 5.0 |
RuntimeInvisibleParameterAnnotations |
4.7.19 | 49.0 | 5.0 |
RuntimeVisibleTypeAnnotations |
4.7.20 | 52.0 | 8 |
RuntimeInvisibleTypeAnnotations |
4.7.21 | 52.0 | 8 |
AnnotationDefault |
4.7.22 | 49.0 | 5.0 |
BootstrapMethods |
4.7.23 | 51.0 | 7 |
MethodParameters |
4.7.24 | 52.0 | 8 |
Module |
4.7.25 | 53.0 | 9 |
ModulePackages |
4.7.26 | 53.0 | 9 |
ModuleMainClass |
4.7.27 | 53.0 | 9 |
NestHost |
4.7.28 | 55.0 | 11 |
NestMembers |
4.7.29 | 55.0 | 11 |
Record |
4.7.30 | 58.65535 | 14 |
表4.7-B. 事前定義済のclassファイル属性(classファイル形式別)
| 属性 | classファイル |
Java SE | セクション |
|---|---|---|---|
ConstantValue |
45.3 | 1.0.2 | 4.7.2 |
Code |
45.3 | 1.0.2 | 4.7.3 |
Exceptions |
45.3 | 1.0.2 | 4.7.5 |
SourceFile |
45.3 | 1.0.2 | 4.7.10 |
LineNumberTable |
45.3 | 1.0.2 | 4.7.12 |
LocalVariableTable |
45.3 | 1.0.2 | 4.7.13 |
InnerClasses |
45.3 | 1.1 | 4.7.6 |
Synthetic |
45.3 | 1.1 | 4.7.8 |
Deprecated |
45.3 | 1.1 | 4.7.15 |
EnclosingMethod |
49.0 | 5.0 | 4.7.7 |
Signature |
49.0 | 5.0 | 4.7.9 |
SourceDebugExtension |
49.0 | 5.0 | 4.7.11 |
LocalVariableTypeTable |
49.0 | 5.0 | 4.7.14 |
RuntimeVisibleAnnotations |
49.0 | 5.0 | 4.7.16 |
RuntimeInvisibleAnnotations |
49.0 | 5.0 | 4.7.17 |
RuntimeVisibleParameterAnnotations |
49.0 | 5.0 | 4.7.18 |
RuntimeInvisibleParameterAnnotations |
49.0 | 5.0 | 4.7.19 |
AnnotationDefault |
49.0 | 5.0 | 4.7.22 |
StackMapTable |
50.0 | 6 | 4.7.4 |
BootstrapMethods |
51.0 | 7 | 4.7.23 |
RuntimeVisibleTypeAnnotations |
52.0 | 8 | 4.7.20 |
RuntimeInvisibleTypeAnnotations |
52.0 | 8 | 4.7.21 |
MethodParameters |
52.0 | 8 | 4.7.24 |
Module |
53.0 | 9 | 4.7.25 |
ModulePackages |
53.0 | 9 | 4.7.26 |
ModuleMainClass |
53.0 | 9 | 4.7.27 |
NestHost |
55.0 | 11 | 4.7.28 |
NestMembers |
55.0 | 11 | 4.7.29 |
Record |
58.65535 | 14 | 4.7.30 |
表4.7-C. 事前定義済のclassファイル属性(位置別)
| 属性 | 位置 | classファイル |
|---|---|---|
SourceFile |
ClassFile |
45.3 |
InnerClasses |
ClassFile |
45.3 |
EnclosingMethod |
ClassFile |
49.0 |
SourceDebugExtension |
ClassFile |
49.0 |
BootstrapMethods |
ClassFile |
51.0 |
Module、ModulePackages、ModuleMainClass |
ClassFile |
53.0 |
NestHost、NestMembers |
ClassFile |
55.0 |
Record |
ClassFile |
58.65535 |
ConstantValue |
field_info |
45.3 |
Code |
method_info |
45.3 |
Exceptions |
method_info |
45.3 |
RuntimeVisibleParameterAnnotations、RuntimeInvisibleParameterAnnotations |
method_info |
49.0 |
AnnotationDefault |
method_info |
49.0 |
MethodParameters |
method_info |
52.0 |
Synthetic |
ClassFile、field_info、method_info |
45.3 |
Deprecated |
ClassFile、field_info、method_info |
45.3 |
Signature |
ClassFile、field_info、method_info、record_component_info |
49.0 |
RuntimeVisibleAnnotations、RuntimeInvisibleAnnotations |
ClassFile、field_info、method_info、record_component_info |
49.0 |
LineNumberTable |
Code |
45.3 |
LocalVariableTable |
Code |
45.3 |
LocalVariableTypeTable |
Code |
49.0 |
StackMapTable |
Code |
50.0 |
RuntimeVisibleTypeAnnotations、RuntimeInvisibleTypeAnnotations |
ClassFile、field_info、method_info、record_component_info、Code |
52.0 |
SyntheticおよびDeprecated属性は原則的に、record_component_info構造体内で許可される場合があります。 ただし、やむを得ない使用事例はまだ特定されていません。
4.7.8 Synthetic属性
Synthetic属性は、ClassFile、field_infoまたはmethod_info構造体(4.1、4.5、4.6)のattributes表内の固定長属性です。 ソース・コード内に出現しないクラス・メンバーは、Synthetic属性を使用してマークする必要があります。そうでない場合、ACC_SYNTHETICフラグが設定されます。 この要件の唯一の例外は、実装のアーティファクトだとはみなされない、コンパイルによって生成されたメソッドメンバー、すなわち、Javaプログラミング言語のデフォルトのコンストラクタを表すインスタンス初期化メソッド(2.9.1)、クラスまたはインスタンス初期化メソッド(2.9.2)、および暗黙的に宣言されたenumおよびレコードのメンバー(JLS 8.9.3, 8.10.3)です。 Enum.values()およびEnum.valueOf()メソッド
Synthetic属性は、ネストしたクラスおよびインタフェースをサポートするためにJDK 1.1で導入されました。
classファイルの制限の1つとして、メソッド・パラメータまたはモジュールはACC_MANDATED(4.7.24、4.7.25)とマークできるが、実装のアーティファクトだとはみなされない、コンパイルによって生成されたメソッドおよびフィールドにフラグを付ける同等の方法は存在しないという制限があります(JLS 13.1)。 この制限は、反射型APIでは、このようなメンバーに要求されたステータスを正確に示すことができない可能性があることを意味します。
Synthetic属性は次の形式を持ちます。
Synthetic_attribute {
u2 attribute_name_index;
u4 attribute_length;
}
Synthetic_attribute構造体の項目は、次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引でのconstant_poolエントリは、文字列「Synthetic」を表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。- attribute_length
attribute_length項目の値はゼロである必要があります。
4.7.9 Signature属性
Signature属性は、ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体(4.1、4.5、4.6、4.7.30)のattributes表内の固定長属性です。 Signature属性は、Javaプログラミング言語の宣言が型変数またはパラメータ化型を使用するクラス、インタフェース、コンストラクタ、メソッド、またはフィールドまたはレコード・コンポーネントのシグネチャ(4.7.9.1)を記録します。 これらのコンストラクトの詳細は、Java言語仕様、Java SE 13 Editionを参照してください。
ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体のattributes表内に存在できるSignature属性は、最大で1つのみです。
Signature属性は次の形式を持ちます。
Signature_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 signature_index;
}
Signature_attribute構造体の項目は、次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引でのconstant_poolエントリは、文字列「Signature」を表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。- attribute_length
attribute_length項目の値は2である必要があります。- signature_index
signature_index項目の値は、constant_pool表に対して有効な索引である必要があります。 その索引でのconstant_poolエントリは、このSignature属性がClassFile構造体の属性である場合はクラスシグネチャ、このSignature属性がmethod_info構造体の属性である場合はメソッドシグネチャ、そうでない場合はフィールド・シグネチャを表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。
OracleのJava仮想マシン実装では、クラスのロードまたはリンク中に
Signature属性の整合性はチェックされません。 かわりに、クラス、インタフェース、コンストラクタ、メソッドおよびフィールドの汎用シグネチャを公開するJava SEプラットフォームのクラス・ライブラリのメソッドによってSignature属性がチェックされます。 例として、Class内のgetGenericSuperclassおよびjava.lang.reflect.Executable内のtoGenericStringがあります。
4.7.9.1 シグネチャ
シグネチャにより、Java仮想マシンの型システムの外部で型を使用する、Javaプログラミング言語で作成された宣言をエンコードします。 これは、リフレクションとデバッグだけでなく、classファイルのみが使用可能な場合のコンパイルをサポートしています。
Javaコンパイラは、宣言が型変数またはパラメータ化型を使用するクラス、インタフェース、コンストラクタ、メソッド、またはフィールドまたはレコード・コンポーネントのシグネチャを生成する必要があります。 特に、Javaコンパイラは次を生成する必要があります。
汎用である、またはスーパークラスまたはスーパーインタフェースとしてパラメータ化型を持つ、あるいはその両方である任意のクラスまたはインタフェース宣言のクラス・シグネチャ。
汎用である、または戻り型または仮パラメータ型としての型変数またはパラメータ化型を持つ、または
throws句内に型変数を持つ、あるいはこれらの組合せである任意のメソッドまたはコンストラクタ宣言のメソッド・シグネチャ。メソッドまたはコンストラクタ宣言の
throws句に型変数が含まれない場合、コンパイラは、メソッド・シグネチャを生成することを目的として、throws句を持たないものとして宣言を扱う場合があります。型が型変数またはパラメータ化型を使用する任意のフィールド、仮パラメータ、
またはローカル変数またはレコード・コンポーネント宣言のフィールド・シグネチャ。
シグネチャは、4.3.1の表記に従う文法を使用して指定されます。 この表記に加えて:
プロダクションの右側の構文[x]は、xがゼロ回または1回発生することを示します。 つまり、xはオプションの記号です。 オプションの記号を含む選択肢として、オプションの記号を省略する選択肢と、オプションの記号を含む選択肢の2つが実質的に定義されています。
右側が非常に長い場合は、2行目を明確にインデントすることによって2行目に続けることができます。
この文法には、Javaコンパイラによって生成される型、フィールド、メソッド、仮パラメータ、ローカル変数または型変数の名前を示すために終端記号識別子が含まれています。 このような名前には、ASCII文字. ; [ / < > : (つまり、メソッド名(4.2.2)で禁止されている文字、さらにコロン)を含めることはできませんが、Javaプログラミング言語内の識別子に出現することが禁止されているモジュールを含めることができます(JLS §3.8)。
シグネチャは、型シグネチャと呼ばれる非終端の階層に依存します。
Java型シグネチャは、Javaプログラミング言語の参照型またはプリミティブ型を表します。
- JavaTypeSignature:
- ReferenceTypeSignature
- BaseType
ここでは、次の4.3.2からのプロダクションを便宜上繰り返しています。
- BaseType:
- (次のうちの1つ)
BCDFIJSZ
参照型シグネチャは、Javaプログラミング言語の参照型、すなわち、クラスまたはインタフェース型、型変数、または配列型を表します。
クラス型シグネチャは、(場合によってはパラメータ化された)クラスまたはインタフェース型を表します。 クラス型シグネチャは、それが示すクラスのバイナリ名に確実にマップできる方法で公式化する必要があります。これを行うには、型引数をすべて消去し、それぞれの
.文字を$文字に変換します。型変数シグネチャは、型変数を表します。
配列型シグネチャは、配列型の1つのディメンションを表します。
- ReferenceTypeSignature:
- ClassTypeSignature
- TypeVariableSignature
- ArrayTypeSignature
- ClassTypeSignature:
L[PackageSpecifier]
SimpleClassTypeSignature {ClassTypeSignatureSuffix};- PackageSpecifier:
- Identifier
/{PackageSpecifier} - SimpleClassTypeSignature:
- Identifier [TypeArguments]
- TypeArguments:
<TypeArgument {TypeArgument}>- TypeArgument:
- [WildcardIndicator] ReferenceTypeSignature
*- WildcardIndicator:
+-- ClassTypeSignatureSuffix:
.SimpleClassTypeSignature- TypeVariableSignature:
TIdentifier;- ArrayTypeSignature:
[JavaTypeSignature
クラス・シグネチャは、(場合によっては汎用)クラス宣言に関する型情報をエンコードします。 これは、クラスの任意の型パラメータを説明し、(場合によってはパラメータ化された)直接スーパークラスおよび直接スーパーインタフェース(存在する場合)をリストします。 型パラメータは、その名前、およびそれに続くクラス・バウンドおよびインタフェース・バウンドによって記述されます。
- ClassSignature:
- [TypeParameters] SuperclassSignature {SuperinterfaceSignature}
- TypeParameters:
<TypeParameter {TypeParameter}>- TypeParameter:
- Identifier ClassBound {InterfaceBound}
- ClassBound:
:[ReferenceTypeSignature]- InterfaceBound:
:ReferenceTypeSignature- SuperclassSignature:
- ClassTypeSignature
- SuperinterfaceSignature:
- ClassTypeSignature
メソッド・シグネチャは、(場合によっては汎用)メソッド宣言に関する型情報をエンコードします。 これは、メソッドの型パラメータ、(場合によってはパラメータ化された)仮パラメータの型、(場合によってはパラメータ化された)戻り型(存在する場合)、およびメソッドのthrows句内で宣言された例外の型を記述します。
- MethodSignature:
- [TypeParameters]
({JavaTypeSignature})Result {ThrowsSignature} - Result:
- JavaTypeSignature
- VoidDescriptor
- ThrowsSignature:
^ClassTypeSignature^TypeVariableSignature
ここでは、次の4.3.3からのプロダクションを便宜上繰り返しています。
- VoidDescriptor:
V
Signature属性によってエンコードされたメソッド・シグネチャは、method_info構造体内のメソッド記述子(4.3.3)に正確に対応していない場合があります。 特に、メソッド・シグネチャ内の仮パラメータ型の数がメソッド記述子内のパラメータ記述子の数と同じである保証はありません。 これらの数は、ほとんどのメタデータの場合は同じですが、Javaプログラミング言語内の特定のコンストラクタには、暗黙的に宣言されたパラメータがあり、これはコンパイラによってパラメータ記述子を使用して表されますが、メソッド・シグネチャからは省略される場合があります。 パラメータ・ノートが関わる同様の状況については、4.7.18のノートを参照してください。
フィールド・シグネチャは、(場合によってはパラメータ化された)フィールドの型、仮パラメータ、またはローカル変数またはレコード・コンポーネント宣言をエンコードします。
- FieldSignature:
- ReferenceTypeSignature
4.7.16 RuntimeVisibleAnnotations属性
RuntimeVisibleAnnotations属性は、ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体のattributes表内の可変長属性です(4.1、4.5、4.6、4.7.30)。 RuntimeVisibleAnnotations属性は、対応するクラス、フィールド、またはメソッドまたはレコード・コンポーネントの宣言上の実行時に表示可能な注釈を記録します。
ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体のattributes表内に存在できるRuntimeVisibleAnnotations属性は、最大で1つのみです。
RuntimeVisibleAnnotations属性の形式は次のとおりです。
RuntimeVisibleAnnotations_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 num_annotations;
annotation annotations[num_annotations];
}
RuntimeVisibleAnnotations_attribute構造体の項目は次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引でのconstant_poolエントリは、文字列「RuntimeVisibleAnnotations」を表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。- attribute_length
attribute_length項目の値は、属性の長さ(先頭の6バイトを除く)を示します。- num_annotations
num_annotations項目の値は、構造体によって表される実行時に表示可能な注釈の数を示します。- annotations[]
annotations表内の各エントリは、宣言上の実行時に表示可能な単一注釈を表します。annotation構造体は次の形式を持ちます。annotation { u2 type_index; u2 num_element_value_pairs; { u2 element_name_index; element_value value; } element_value_pairs[num_element_value_pairs]; }annotation構造体の項目は、次のとおりです。- type_index
type_index項目の値は、constant_pool表に対して有効な索引である必要があります。 その索引でのconstant_poolエントリは、フィールド記述子(4.3.2)を表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。 フィールド記述子は、このannotation構造体によって表される注釈の型を示します。- num_element_value_pairs
num_element_value_pairs項目の値は、このannotation構造体によって表される注釈の要素値ペアの数を示します。- element_value_pairs[]
element_value_pairs表のそれぞれの値は、このannotation構造体によって表される注釈の単一の要素値ペアを示します。 各element_value_pairsエントリには、次の2つの項目が含まれます。- element_name_index
element_name_index項目の値は、constant_pool表に対して有効な索引である必要があります。 その索引でのconstant_poolエントリは、CONSTANT_Utf8_info構造体(4.4.7)である必要があります。constant_poolエントリは、このelement_value_pairsエントリによって表される要素値ペアの要素の名前を示します。つまり、このエントリは、
type_indexによって指定される注釈型の要素を示します。- value
value項目の値は、このelement_value_pairsエントリによって表される要素値ペアの値を表します。
4.7.17 RuntimeInvisibleAnnotations属性
RuntimeInvisibleAnnotations属性は、ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体(4.1、4.5、4.6、4.7.30)のattributes表内の可変長属性です。 RuntimeInvisibleAnnotations属性は、対応するクラス、メソッド、またはフィールドまたはレコード・コンポーネントの宣言上の実行時に表示不可能な注釈を記録します。
ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体のattributes表内に存在できるRuntimeInvisibleAnnotations属性は、最大で1つのみです。
RuntimeInvisibleAnnotations属性は、RuntimeVisibleAnnotations属性(4.7.16)と似ていますが、RuntimeInvisibleAnnotations属性によって表される注釈は、コマンドライン・フラグなどの一部の実装固有のメカニズムを介してこれらの注釈を保持するようJava仮想マシンが指示されていないかぎり、反射型APIによる戻り値に対して使用可能にしない必要がある点を除きます。 このような指示がない場合、Java仮想マシンはこの属性を無視します。
RuntimeInvisibleAnnotations属性の形式は次のとおりです。
RuntimeInvisibleAnnotations_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 num_annotations;
annotation annotations[num_annotations];
}
RuntimeInvisibleAnnotations_attribute構造体の項目は次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引でのconstant_poolエントリは、文字列「RuntimeInvisibleAnnotations」を表すCONSTANT_Utf8_info構造体(4.4.7)にする必要があります。- attribute_length
attribute_length項目の値は、属性の長さ(先頭の6バイトを除く)を示します。- num_annotations
num_annotations項目の値は、構造体によって表される実行時に表示不可能な注釈の数を示します。- annotations[]
annotations表内の各エントリは、宣言上の実行時に表示不可能な単一の注釈を表します。annotation構造体は、4.7.16に規定されています。
4.7.20 RuntimeVisibleTypeAnnotations属性
RuntimeVisibleTypeAnnotations属性は、ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体、またはCode属性のattributes表内の可変長属性です(4.1、4.5、4.6、4.7.30、4.7.3)。 RuntimeVisibleTypeAnnotations属性は、対応するクラス、フィールド、またはメソッドまたはレコード・コンポーネントの宣言内、または対応するメソッド本体内の式内で使用される型で実行時に表示可能な注釈を記録します。 また、RuntimeVisibleTypeAnnotations属性は、汎用クラス、インタフェース、メソッドおよびコンストラクタの型パラメータ宣言で実行時に表示可能な注釈も記録します。
ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体、またはCode属性のattributes表内に存在できるRuntimeVisibleTypeAnnotations属性は、最大で1つのみです。
attributes表にRuntimeVisibleTypeAnnotations属性が含まれるのは、attributes表の親構造体または属性に対応する宣言または式の種類で型に注釈が付けられている場合のみです。
たとえば、クラス宣言の
implements句内の型に対する注釈はすべて、クラスのClassFile構造体のRuntimeVisibleTypeAnnotations属性内に記録されます。 一方、フィールド宣言内の型に対する注釈はすべて、フィールドのfield_info構造体のRuntimeVisibleTypeAnnotations属性内に記録されます。
RuntimeVisibleTypeAnnotations属性の形式は次のとおりです。
RuntimeVisibleTypeAnnotations_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 num_annotations;
type_annotation annotations[num_annotations];
}
RuntimeVisibleTypeAnnotations_attribute構造体の項目は次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引では、constant_poolエントリを文字列「RuntimeVisibleTypeAnnotations」を表すCONSTANT_Utf8_info構造体にする必要があります。- attribute_length
attribute_length項目の値は、属性の長さ(先頭の6バイトを除く)を示します。- num_annotations
num_annotations項目の値は、構造体によって表される実行時に表示可能な型注釈の数を示します。- annotations[]
annotations表内の各エントリは、宣言または式内で使用される型上の実行時に表示可能な単一の注釈を表します。type_annotation構造体は次の形式を持ちます。type_annotation { u1 target_type; union { type_parameter_target; supertype_target; type_parameter_bound_target; empty_target; formal_parameter_target; throws_target; localvar_target; catch_target; offset_target; type_argument_target; } target_info; type_path target_path; u2 type_index; u2 num_element_value_pairs; { u2 element_name_index; element_value value; } element_value_pairs[num_element_value_pairs]; }最初の3つの項目
target_type、target_infoおよびtarget_pathは、注釈付きの型の正確な位置を指定します。 最後の3つの項目type_index、num_element_value_pairsおよびelement_value_pairs[]は、注釈の独自の型および要素値のペアを指定します。type_annotation構造体の項目は、次のとおりです。- target_type
target_type項目の値は、注釈が出現するターゲットの種類を示します。 様々な種類のターゲットが、型を宣言および式で使用するJavaプログラミング言語のtype contextsに対応しています(JLS §4.11)。target_typeの正規値は、表4.7.20-Aおよび表4.7.20-Bに規定されています。 それぞれの値は、target_type項目にどのtarget_info結合の項目が続くかを示す1バイトのタグであり、ターゲットに関する詳細情報を提供します。表4.7.20-Aおよび表4.7.20-B内のターゲットの種類は、JLS §4.11内の型コンテキストに対応しています。 つまり、
target_type値0x10~0x17および0x40~0x42は型コンテキスト1~10に対応しており、target_type値0x43~0x4Bは型コンテキスト11~16に対応しています。target_type項目の値により、type_annotation構造体がClassFile構造体、field_info構造体、method_info構造体またはCode属性のいずれのRuntimeVisibleTypeAnnotations属性内に出現するかが決まります。 表4.7.20-Cは、正規の各target_type値を使用してtype_annotation構造体のRuntimeVisibleTypeAnnotations属性の位置を示します。- target_info
target_info項目の値は、宣言または式内のどの型に注釈が付けられているかを正確に示します。target_info結合の項目は、4.7.20.1に規定されています。- target_path
target_path項目の値は、target_infoによって示される型のどの部分に注釈が付けられているかを正確に示します。type_path構造体の形式は、4.7.20.2に規定されています。- type_index、num_element_value_pairs、element_value_pairs[]
type_annotation構造体内のこれらの項目の意味は、annotation構造体内の意味と同じです(4.7.16)。
表4.7.20-A. target_type値の解釈(第1部)
| 値 | ターゲットの種類 | target_info項目 |
|---|---|---|
| 0x00 | 汎用クラスまたはインタフェースの型パラメータ宣言 | type_parameter_target |
| 0x01 | 汎用メソッドまたはコンストラクタの型パラメータ宣言 | type_parameter_target |
| 0x10 | クラス宣言のextendsまたはimplements句内の型(無名クラス宣言の直接スーパークラスまたは直接スーパーインタフェースを含む)、またはインタフェース宣言のextends句内の型 |
supertype_target |
| 0x11 | 汎用クラスまたはインタフェースの型パラメータ宣言のバウンド内の型 | type_parameter_bound_target |
| 0x12 | 汎用メソッドまたはコンストラクタの型パラメータ宣言のバウンド内の型 | type_parameter_bound_target |
| 0x13 | フィールドまたはレコード・コンポーネント宣言内の型 | empty_target |
| 0x14 | メソッドの戻り型、または新しく構築されたオブジェクトの型 | empty_target |
| 0x15 | メソッドまたはコンストラクタのレシーバ型 | empty_target |
| 0x16 | メソッド、コンストラクタまたはラムダ式の仮パラメータ宣言内の型 | formal_parameter_target |
| 0x17 | メソッドまたはコンストラクタのthrows区内の型 |
throws_target |
表4.7.20-B. target_type値の解釈(第2部)
| 値 | ターゲットの種類 | target_info項目 |
|---|---|---|
| 0x40 | ローカル変数宣言内の型 | localvar_target |
| 0x41 | リソース変数宣言内の型 | localvar_target |
| 0x42 | 例外パラメータ宣言内の型 | catch_target |
| 0x43 | instanceof式内の型 | offset_target |
| 0x44 | new式内の型 | offset_target |
| 0x45 | ::newを使用したメソッド参照式内の型 |
offset_target |
| 0x46 | ::Identifierを使用したメソッド参照式内の型 |
offset_target |
| 0x47 | キャスト式内の型 | type_argument_target |
| 0x48 | new式または明示的なコンストラクタ呼出し文内の汎用コンストラクタの型引数 | type_argument_target |
| 0x49 | メソッド呼出し式内の汎用メソッドの型引数 | type_argument_target |
| 0x4A | ::newを使用したメソッド参照式内の汎用コンストラクタの型引数 |
type_argument_target |
| 0x4B | ::Identifierを使用したメソッド参照式内の汎用メソッドの型引数 |
type_argument_target |
表4.7.20-C. target_type値を囲む属性の位置
| 値 | ターゲットの種類 | 位置 |
|---|---|---|
| 0x00 | 汎用クラスまたはインタフェースの型パラメータ宣言 | ClassFile |
| 0x01 | 汎用メソッドまたはコンストラクタの型パラメータ宣言 | method_info |
| 0x10 | クラスまたはインタフェース宣言のextends句内の型、またはインタフェース宣言のimplements句内の型 |
ClassFile |
| 0x11 | 汎用クラスまたはインタフェースの型パラメータ宣言のバウンド内の型 | ClassFile |
| 0x12 | 汎用メソッドまたはコンストラクタの型パラメータ宣言のバウンド内の型 | method_info |
| 0x13 | フィールドまたはレコード・コンポーネント宣言内の型 | field_info、record_component_info |
| 0x14 | メソッドまたはコンストラクタの戻り型 | method_info |
| 0x15 | メソッドまたはコンストラクタのレシーバ型 | method_info |
| 0x16 | メソッド、コンストラクタまたはラムダ式の仮パラメータ宣言内の型 | method_info |
| 0x17 | メソッドまたはコンストラクタのthrows区内の型 |
method_info |
| 0x40~0x4B | ローカル変数宣言、リソース変数宣言、例外パラメータ宣言および式内の型 | Code |
将来の繰返しでは、0x13を再使用するのではなく、レコード・コンポーネントに新しいtarget_type値を導入する方が適切になる可能性があります。
4.7.20.1 target_info結合
...
empty_target項目は、フィールド宣言内の型、レコード・コンポーネント宣言内の型、メソッドの戻り型、新しく構築されたオブジェクトの型、またはメソッドまたはコンストラクタのレシーバ型のどれに注釈が出現するかを示します。empty_target { }それぞれの位置に出現する型は1つのみであるため、
target_info結合内に示される型別の情報はありません。
...
4.7.21 RuntimeInvisibleTypeAnnotations属性
RuntimeInvisibleTypeAnnotations属性は、ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体、またはCode属性のattributes表内の可変長属性です(4.1、4.5、4.6、4.7.30、4.7.3)。 RuntimeInvisibleTypeAnnotations属性は、対応するクラス、フィールド、またはメソッドまたはレコード・コンポーネントの宣言内、または対応するメソッド本体の式内で使用される型で実行時に表示不可能な注釈を記録します。 また、RuntimeInvisibleTypeAnnotations属性は、汎用クラス、インタフェース、メソッドおよびコンストラクタの型パラメータ宣言上の注釈も記録します。
ClassFile、field_info、またはmethod_infoまたはrecord_component_info構造体、またはCode属性のattributes表内に存在できるRuntimeInvisibleTypeAnnotations属性は、最大で1つのみです。
attributes表にRuntimeInvisibleTypeAnnotations属性が含まれるのは、attributes表の親構造体または属性に対応する宣言または式の種類で型に注釈が付けられている場合のみです。
RuntimeInvisibleTypeAnnotations属性の形式は次のとおりです。
RuntimeInvisibleTypeAnnotations_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 num_annotations;
type_annotation annotations[num_annotations];
}
RuntimeInvisibleTypeAnnotations_attribute構造体の項目は次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引では、constant_poolエントリを文字列「RuntimeInvisibleTypeAnnotations」を表すCONSTANT_Utf8_info構造体にする必要があります。- attribute_length
attribute_length項目の値は、属性の長さ(先頭の6バイトを除く)を示します。- num_annotations
num_annotations項目の値は、シグネチャによって表される実行時に表示不可能な型注釈の数を示します。- annotations[]
annotations表内の各エントリは、宣言または式内で使用される型上の実行時に表示不可能な単一の注釈を表します。type_annotation構造体は、4.7.20に規定されています。
4.7.30 Record属性
Record属性は、ClassFile構造体のattributes表内の可変長属性です。 Record属性は、レコード型のコンポーネントに関する情報を示します(JLS 8.10)。
ClassFile構造体のattributes表内に存在できるRecord属性は、最大で1つのみです。
Record属性の形式は次のとおりです。
Record_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 components_count;
record_component_info components[components_count];
}
Record_attribute構造体の項目は次のとおりです。
- attribute_name_index
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。 その索引でのconstant_poolエントリは、文字列「Record」を表すCONSTANT_Utf8_info構造体(4.4.7)にする必要があります。- attribute_length
attribute_length項目の値は、属性の長さ(先頭の6バイトを除く)を示します。- components_count
components_count項目の値は、components表内のエントリの数を示します。- components[]
レコードのそれぞれのコンポーネントは、コンポーネントが宣言された順序で、
components配列内の対応するエントリを正確に1つ持つ必要があります。record_component_info構造体は次の形式を持ちます。record_component_info { u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; }record_component_info構造体の項目は次のとおりです。- name_index
name_index項目の値は、constant_pool表に対して有効な索引である必要があります。 その索引でのconstant_poolエントリは、レコード・コンポーネントの未修飾の名前(4.2.2)を表すCONSTANT_Utf8_info構造体である必要があります。- descriptor_index
descriptor_index項目の値は、constant_pool表に対して有効な索引である必要があります。 その索引でのconstant_poolエントリは、レコード・コンポーネントのJVM型(4.3.2)をエンコードするフィールド記述子を表すCONSTANT_Utf8_info構造体である必要があります。- attributes_count
attributes_count項目の値は、このレコード・コンポーネントの追加属性の数を示します。- attributes[]
attributes表のそれぞれの値は、attribute_info構造体である必要があります(4.7)。レコード・コンポーネントには、それに関連付けられた任意の数のオプション属性を使用できます。
この仕様で
record_component_info構造体のattributes表内に出現するものとして定義されている属性は、表4.7-Cにリストされています。record_component_info構造体のattributes表内に出現するものとして定義されている属性に関するルールは、4.7にリストされています。record_component_info構造体のattributes表内に事前定義されていない属性に関するルールは、4.7.1にリストされています。