レコード

Java®仮想マシン仕様バージョン15+36-1562への変更

このドキュメントでは、Java SE 15のプレビュー機能である、Javaプログラミング言語のレコードをサポートするためのJava仮想マシン仕様の変更点について説明します。この機能の概要は、JEPドラフトを参照してください。

コンパニオン・ドキュメントでは、レコードをサポートするためにJava言語仕様に必要な変更について説明します。

変更は、JVM仕様の既存のセクションに関して説明します。新しいテキストはこのように示され、削除されたテキストはこのように示されます。必要に応じて、説明と考察が端の方にグレーのボックスで囲まれて記載されています。

第4章: classファイル形式

4.7 属性

属性は、classファイル形式のClassFilefield_infomethod_infoおよびCode_attributeおよびrecord_component_info構造体で使用されます(4.14.54.64.7.34.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回に分けてリストされています。

この仕様でのこれらの使用状況、つまり、これらが出現するclassファイル構造体のattributes表において、これらの事前定義済の属性の名前が予約されています。

attributes表内における事前定義済の属性の存在に関する条件は、属性を説明するセクションで明示的に規定されています。条件が規定されていない場合、属性はattributes表内に任意の回数出現する場合があります。

事前定義済の属性は、その目的に応じて3つのグループに分類されます。

  1. Java仮想マシンによるclassファイルの正しい解釈には、6つの属性が不可欠です。

    • ConstantValue
    • Code
    • StackMapTable
    • BootstrapMethods
    • NestHost
    • NestMembers

    バージョン番号がvであるclassファイル内では、Java仮想マシンの実装がclassファイル形式のバージョンvをサポートしており、属性がclassファイル形式のバージョンv以前で最初に定義されたもので、その属性が出現先として定義されている場所に出現している場合、これらの各属性はJava仮想マシンの実装によって識別され、適切に読み取られます。

  2. 9つ10の属性は、Java仮想マシンによるclassファイルの正しい解釈に不可欠ではありませんが、Java SEプラットフォームのクラス・ライブラリによるclassファイルの正しい解釈に不可欠であるか、ツールの役に立ちます(この場合、属性を規定するセクションは「オプション」として記載されています)。

    • Exceptions
    • InnerClasses
    • EnclosingMethod
    • Synthetic
    • Signature
    • SourceFile
    • LineNumberTable
    • LocalVariableTable
    • LocalVariableTypeTable
    • Record

    バージョン番号がvであるclassファイル内では、Java仮想マシンの実装がclassファイル形式のバージョンvをサポートしており、属性がclassファイル形式のバージョンv以前で最初に定義されたもので、その属性が出現先として定義されている場所に出現している場合、これらの各属性はJava仮想マシンの実装によって識別され、適切に読み取られます。

  3. 13の属性は、Java仮想マシンによるclassファイルの正しい解釈に不可欠ではありませんが、Java SEプラットフォームのクラス・ライブラリによって公開されるclassファイルに関するメタデータを含むか、ツールによって使用可能になります(この場合、属性を規定するセクションは「オプション」として記載されています)。

    • SourceDebugExtension
    • Deprecated
    • RuntimeVisibleAnnotations
    • RuntimeInvisibleAnnotations
    • RuntimeVisibleParameterAnnotations
    • RuntimeInvisibleParameterAnnotations
    • RuntimeVisibleTypeAnnotations
    • RuntimeInvisibleTypeAnnotations
    • AnnotationDefault
    • MethodParameters
    • Module
    • ModulePackages
    • ModuleMainClass

    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 59.65535 15

表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 59.65535 15 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
ModuleModulePackagesModuleMainClass ClassFile 53.0
NestHostNestMembers ClassFile 55.0
Record ClassFile 59.65535
ConstantValue field_info 45.3
Code method_info 45.3
Exceptions method_info 45.3
RuntimeVisibleParameterAnnotationsRuntimeInvisibleParameterAnnotations method_info 49.0
AnnotationDefault method_info 49.0
MethodParameters method_info 52.0
Synthetic ClassFilefield_infomethod_info 45.3
Deprecated ClassFilefield_infomethod_info 45.3
Signature ClassFilefield_infomethod_inforecord_component_info 49.0
RuntimeVisibleAnnotationsRuntimeInvisibleAnnotations ClassFilefield_infomethod_inforecord_component_info 49.0
LineNumberTable Code 45.3
LocalVariableTable Code 45.3
LocalVariableTypeTable Code 49.0
StackMapTable Code 50.0
RuntimeVisibleTypeAnnotationsRuntimeInvisibleTypeAnnotations ClassFilefield_infomethod_inforecord_component_infoCode 52.0

SyntheticおよびDeprecated属性は原則的に、record_component_info構造体内で許可される場合があります。ただし、説得力のあるユースケースは確認されていません。

4.7.8 Synthetic属性

Synthetic属性は、ClassFilefield_infoまたはmethod_info構造体(4.14.54.6)のattributes表内の固定長属性です。ソース・コード内に出現しないクラス・メンバーは、Synthetic属性を使用してマークする必要があります。そうでない場合、ACC_SYNTHETICフラグが設定されます。この要件の唯一の例外は、実装のアーティファクトだとはみなされない、コンパイルによって生成されたメソッドメンバー、すなわち、Javaプログラミング言語のデフォルトのコンストラクタを表すインスタンス初期化メソッド(2.9.1)、クラスまたはインタフェース初期化メソッド(2.9.2)、およびEnum.values()およびEnum.valueOf()メソッド暗黙的に宣言されたenumクラスおよびレコード・クラスのメンバー(JLS 8.9.3、8.10.3)です。

Synthetic属性は、ネストしたクラスおよびインタフェースをサポートするためにJDK 1.1で導入されました。

classファイルの制限の1つとして、メソッド・パラメータまたはモジュールはACC_MANDATED (4.7.244.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属性は、ClassFilefield_infoまたはmethod_infoまたはrecord_component_info構造体(4.14.54.64.7.30)のattributes表内の固定長属性です。Signature属性は、Javaプログラミング言語の宣言が型変数またはパラメータ化型を使用するクラス、インタフェース、コンストラクタ、メソッド、またはフィールドまたはレコード・コンポーネントのシグネチャ(4.7.9.1)を記録します。これらのコンストラクトの詳細は、Java言語仕様、Java SE 13 Editionを参照してください。

ClassFilefield_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コンパイラは次を生成する必要があります。

シグネチャは、4.3.1の表記に従う文法を使用して指定されます。この表記に加えて:

この文法には、Javaコンパイラによって生成される型、フィールド、メソッド、仮パラメータ、ローカル変数または型変数の名前を示すために終端記号識別子が含まれています。このような名前には、ASCII文字. ; [ / < > : (つまり、メソッド名(4.2.2)で禁止されている文字、さらにコロン)を含めることはできませんが、Javaプログラミング言語内の識別子に出現することが禁止されているモジュールを含めることができます(JLS §3.8)。

シグネチャは、型シグネチャと呼ばれる非終端の階層に依存します。

クラス・シグネチャは、(場合によっては汎用)クラス宣言に関する型情報をエンコードします。これは、クラスの任意の型パラメータを説明し、(場合によってはパラメータ化された)直接スーパークラスおよび直接スーパーインタフェース(存在する場合)をリストします。型パラメータは、その名前、およびそれに続くクラス・バウンドおよびインタフェース・バウンドによって記述されます。

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属性は、ClassFilefield_infoまたはmethod_infoまたはrecord_component_info構造体のattributes表内の可変長属性です(4.14.54.64.7.30)。RuntimeVisibleAnnotations属性は、対応するクラス、フィールド、またはメソッドまたはレコード・コンポーネントの宣言上の実行時に表示可能な注釈を記録します。

ClassFilefield_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属性は、ClassFilefield_infoまたはmethod_infoまたはrecord_component_info構造体(4.14.54.64.7.30)のattributes表内の可変長属性です。RuntimeInvisibleAnnotations属性は、対応するクラス、メソッド、またはフィールドまたはレコード・コンポーネントの宣言上の実行時に表示不可能な注釈を記録します。

ClassFilefield_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属性は、ClassFilefield_infoまたはmethod_infoまたはrecord_component_info構造体、またはCode属性のattributes表内の可変長属性です(4.14.54.64.7.304.7.3)。RuntimeVisibleTypeAnnotations属性は、対応するクラス、フィールド、またはメソッドまたはレコード・コンポーネントの宣言内、または対応するメソッド本体内の式内で使用される型で実行時に表示可能な注釈を記録します。また、RuntimeVisibleTypeAnnotations属性は、汎用クラス、インタフェース、メソッドおよびコンストラクタの型パラメータ宣言で実行時に表示可能な注釈も記録します。

ClassFilefield_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_typetarget_infoおよびtarget_pathは、注釈付きの型の正確な位置を指定します。最後の3つの項目type_indexnum_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_inforecord_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結合

...

...

4.7.21 RuntimeInvisibleTypeAnnotations属性

RuntimeInvisibleTypeAnnotations属性は、ClassFilefield_infoまたはmethod_infoまたはrecord_component_info構造体、またはCode属性のattributes表内の可変長属性です(4.14.54.64.7.304.7.3)。RuntimeInvisibleTypeAnnotations属性は、対応するクラス、フィールド、またはメソッドまたはレコード・コンポーネントの宣言内、または対応するメソッド本体の式内で使用される型で実行時に表示不可能な注釈を記録します。また、RuntimeInvisibleTypeAnnotations属性は、汎用クラス、インタフェース、メソッドおよびコンストラクタの型パラメータ宣言上の注釈も記録します。

ClassFilefield_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にリストされています。