このドキュメントでは、Java SE 24のプレビュー機能であるモジュール・インポート宣言をサポートするための、Java仮想マシン仕様に対する変更点について説明します。この機能の概要は、JEP 494を参照してください。
コンパニオン・ドキュメントでは、モジュール・インポート宣言をサポートするためにJava言語仕様で必要となった変更点について説明します。
Java仮想マシン仕様(JVMS)の既存の項に関して変更点を説明します。新しいテキストはこのように示され、削除されたテキストはこのように示されます。必要に応じて、説明と考察が端の方にグレーのボックスで囲まれて記載されています。
変更ログ:
2024-10: 初稿。
第4章: classファイル形式
4.7 属性
4.7.25 Module属性
Module属性は、ClassFile構造体(4.1)のattributes表内の可変長属性です。Module属性は、モジュールに必要なモジュール、モジュールによってエクスポートおよびオープンされるパッケージ、およびモジュールによって使用および提供されるサービスを示します。
ClassFile構造体のattributes表内に存在できるModule属性は、最大で1つのみです。
Module属性の形式は次のとおりです:
Module_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 module_name_index;
u2 module_flags;
u2 module_version_index;
u2 requires_count;
{ u2 requires_index;
u2 requires_flags;
u2 requires_version_index;
} requires[requires_count];
u2 exports_count;
{ u2 exports_index;
u2 exports_flags;
u2 exports_to_count;
u2 exports_to_index[exports_to_count];
} exports[exports_count];
u2 opens_count;
{ u2 opens_index;
u2 opens_flags;
u2 opens_to_count;
u2 opens_to_index[opens_to_count];
} opens[opens_count];
u2 uses_count;
u2 uses_index[uses_count];
u2 provides_count;
{ u2 provides_index;
u2 provides_with_count;
u2 provides_with_index[provides_with_count];
} provides[provides_count];
}
Module_attribute構造体の項目は次のとおりです:
- attribute_name_index
-
attribute_name_index項目の値は、constant_pool表への有効な索引にする必要があります。その索引でのconstant_poolエントリは、文字列「Module」を表すCONSTANT_Utf8_info構造体(4.4.7)である必要があります。 - attribute_length
-
attribute_length項目の値は、属性の長さ(先頭の6バイトを除く)を示します。 - module_name_index
-
module_name_index項目の値は、constant_pool表への有効な索引である必要があります。その索引でのconstant_poolエントリは、現在のモジュールを示すCONSTANT_Module_info構造体(4.4.11)である必要があります。 - module_flags
-
module_flags項目の値は次のとおりです:- 0x0020 (
ACC_OPEN) -
このモジュールが開かれていることを示します。
- 0x1000 (
ACC_SYNTHETIC) -
このモジュールが明示的または暗黙的に宣言されていないことを示します。
- 0x8000 (
ACC_MANDATED) -
このモジュールが暗黙的に宣言されたことを示します。
- 0x0020 (
- module_version_index
-
module_version_index項目の値は、0(ゼロ)またはconstant_pool表への有効な索引である必要があります。項目の値がゼロの場合、現在のモジュールに関するバージョン情報は存在しません。項目の値が0以外の場合、その索引でのconstant_poolエントリは、現在のモジュールのバージョンを表すCONSTANT_Utf8_info構造体である必要があります。 - requires_count
-
requires_count項目の値は、requires表内のエントリの数を示します。現在のモジュールが
java.baseの場合、requires_countはゼロである必要があります。現在のモジュールが
java.baseでない場合、requires_countは少なくとも1である必要があります。 - requires[]
-
requires表の各エントリは、現在のモジュールの依存関係を指定します。各エントリの項目は次のとおりです:- requires_index
-
requires_index項目の値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、現在のモジュールが依存するモジュールを示すCONSTANT_Module_info構造体である必要があります。requires表内の最大1つのエントリで、requires_index項目を使用して特定の名前のモジュールを指定できます。 - requires_flags
-
requires_flags項目の値は次のとおりです:- 0x0020 (
ACC_TRANSITIVE) -
現在のモジュールに依存するモジュールが、このエントリによって示されるモジュールへの依存関係を暗黙的に宣言することを示します。
- 0x0040 (
ACC_STATIC_PHASE) -
この依存関係は、静的フェーズ(コンパイル時)では必須であるが、動的フェーズ(実行時)ではオプションであることを示します。
- 0x1000 (
ACC_SYNTHETIC) -
この依存関係がモジュール宣言のソースで明示的または暗黙的に宣言されていないことを示します。
- 0x8000 (
ACC_MANDATED) -
この依存関係がモジュール宣言のソースで暗黙的に宣言されたことを示します。
- 0x0020 (
- requires_version_index
-
requires_version_index項目の値は、0 (ゼロ)またはconstant_pool表への有効な索引である必要があります。この項目の値がゼロの場合、依存関係に関するバージョン情報は存在しません。項目の値が0以外の場合、その索引でのconstant_poolエントリは、requires_indexで指定されたモジュールのバージョンを表すCONSTANT_Utf8_info構造体である必要があります。
現在のモジュールが
java.baseでないかぎり、requires表のエントリには、次のすべてが含まれている必要があります:java.baseを示すrequires_index項目。ACC_SYNTHETICフラグが設定されていないrequires_flags項目。(ACC_MANDATEDフラグおよびACC_TRANSITIVEフラグは設定できます。)classファイルのバージョン番号が54.0以上である場合、ACC_TRANSITIVEおよびACC_STATIC_PHASEフラグフラグの両方が設定されているrequires_flags項目。
- exports_count
-
exports_count項目の値は、exports表内のエントリの数を示します。 - exports[]
-
exports表の各エントリは、現在のモジュールによってエクスポートされたパッケージを指定します。パッケージ内のpublic型とprotected型、およびそれらのpublicメンバーとprotectedメンバーには、現在のモジュールの外部から(場合によっては制限された「フレンド」モジュールのセットから)アクセスできます。各エントリの項目は次のとおりです:
- exports_index
-
exports_index項目の値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、現在のモジュールによってエクスポートされたパッケージを表すCONSTANT_Package_info構造体(4.4.12)である必要があります。exports表内の最大1つのエントリで、exports_index項目を使用して特定の名前のパッケージを指定できます。 - exports_flags
-
exports_flags項目の値は次のとおりです:- 0x1000 (
ACC_SYNTHETIC) -
このエクスポートがモジュール宣言のソースで明示的または暗黙的に宣言されていないことを示します。
- 0x8000 (
ACC_MANDATED) -
このエクスポートがモジュール宣言のソースで暗黙的に宣言されたことを示します。
- 0x1000 (
- exports_to_count
-
exports_to_countの値は、exports_to_index表のエントリの数を示します。exports_to_countがゼロの場合、このパッケージは現在のモジュールによって修飾されていない形式でエクスポートされています。他のモジュールのコードは、そのパッケージ内の型およびメンバーにアクセスできます。exports_to_countがゼロ以外の場合、このパッケージは現在のモジュールによって修飾された形式でエクスポートされています。exports_to_index表にリストされているモジュールのコードのみが、そのパッケージ内の型およびメンバーにアクセスできます。 - exports_to_index[]
-
exports_to_index表内の各エントリの値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、コードがこのエクスポートされたパッケージ内の型およびメンバーにアクセスできるモジュールを示すCONSTANT_Module_info構造体である必要があります。exports表内の各エントリでは、そのexports_to_index表内の最大1つのエントリで、特定の名前のモジュールを指定できます。
- opens_count
-
opens_count項目の値は、opens表内のエントリの数を示します。現在のモジュールが開いている場合、
opens_countはゼロである必要があります。 - opens[]
-
opens表の各エントリは、現在のモジュールによって開かれているパッケージを指定します。これにより、パッケージ内のすべての型とそのすべてのメンバーに、Java SEプラットフォームのリフレクション・ライブラリを介して現在のモジュールの外部から(場合によっては制限された「フレンド」モジュールのセットから)アクセスできるようになります。各エントリの項目は次のとおりです:
- opens_index
-
opens_index項目の値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、現在のモジュールによって開かれたパッケージを表すCONSTANT_Package_info構造体である必要があります。opens表内の最大1つのエントリで、opens_index項目を使用して特定の名前のパッケージを指定できます。 - opens_flags
-
opens_flags項目の値は次のとおりです:- 0x1000 (
ACC_SYNTHETIC) -
このオープンがモジュール宣言のソースで明示的または暗黙的に宣言されていないことを示します。
- 0x8000 (
ACC_MANDATED) -
このオープンがモジュール宣言のソースで暗黙的に宣言されたことを示します。
- 0x1000 (
- opens_to_count
-
opens_to_countの値は、opens_to_index表のエントリの数を示します。opens_to_countがゼロの場合、このパッケージは現在のモジュールによって修飾されていない形式で開かれています。他のモジュールのコードは、そのパッケージ内の型およびメンバーにリフレクティブにアクセスできます。opens_to_countがゼロ以外の場合、このパッケージは現在のモジュールによって修飾された形式で開かれています。opens_to_index表にリストされているモジュール内のコードのみが、そのパッケージ内の型およびメンバーにリフレクティブにアクセスできます。 - opens_to_index[]
-
opens_to_index表内の各エントリの値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、コードがこのオープン・パッケージ内の型およびメンバーにアクセスできるモジュールを示すCONSTANT_Module_info構造体である必要があります。opens表内の各エントリでは、そのopens_to_index表内の最大1つのエントリで、特定の名前のモジュールを指定できます。
- uses_count
-
uses_count項目の値は、uses_index表内のエントリの数を示します。 - uses_index[]
-
uses_index表内の各エントリの値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、現在のモジュールがjava.util.ServiceLoaderを介して検出できるサービス・インタフェースを表すCONSTANT_Class_info構造体(4.4.1)である必要があります。uses_index表内の最大1つのエントリで、特定の名前のサービス・インタフェースを指定できます。 - provides_count
-
provides_count項目の値は、provides表内のエントリの数を示します。 - provides[]
-
provides表の各エントリは、特定のサービス・インタフェースのサービス実装を表します。各エントリの項目は次のとおりです:
- provides_index
-
provides_index項目の値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、現在のモジュールがサービス実装を提供するサービス・インタフェースを表すCONSTANT_Class_info構造体である必要があります。provides表内の最大1つのエントリで、provides_index項目を使用して特定の名前のサービス・インタフェースを指定できます。 - provides_with_count
-
provides_with_countの値は、provides_with_index表内のエントリの数を示します。provides_with_countはゼロ以外にする必要があります。 - provides_with_index[]
-
provides_with_index表内の各エントリの値は、constant_pool表に対して有効な索引である必要があります。その索引でのconstant_poolエントリは、provides_indexで指定されたサービス・インタフェースのサービス実装を表すCONSTANT_Class_info構造体である必要があります。provides表内の各エントリでは、そのprovides_with_index表内の最大1つのエントリで、特定の名前のサービス実装を指定できます。