このドキュメントでは、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つのエントリで、特定の名前のサービス実装を指定できます。