このドキュメントでは、Java SE 15のプレビュー機能である、Javaプログラミング言語のレコードをサポートするためのJava仮想マシン仕様の変更点について説明します。この機能の概要は、JEPドラフトを参照してください。
コンパニオン・ドキュメントでは、レコードをサポートするために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つの属性が不可欠です。ConstantValue
Code
StackMapTable
BootstrapMethods
NestHost
NestMembers
バージョン番号がvである
class
ファイル内では、Java仮想マシンの実装がclass
ファイル形式のバージョンvをサポートしており、属性がclass
ファイル形式のバージョンv以前で最初に定義されたもので、その属性が出現先として定義されている場所に出現している場合、これらの各属性はJava仮想マシンの実装によって識別され、適切に読み取られます。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仮想マシンの実装によって識別され、適切に読み取られます。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 |
Module 、ModulePackages 、ModuleMainClass |
ClassFile |
53.0 |
NestHost 、NestMembers |
ClassFile |
55.0 |
Record |
ClassFile |
59.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つ)
B
C
D
F
I
J
S
Z
参照型シグネチャは、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:
T
Identifier;
- 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にリストされています。