モジュール・インポート宣言(第2プレビュー)

Java®仮想マシン仕様の変更点・バージョン24+36-3646

このドキュメントでは、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)

このモジュールが暗黙的に宣言されたことを示します。

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)

この依存関係がモジュール宣言のソースで暗黙的に宣言されたことを示します。

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)

このエクスポートがモジュール宣言のソースで暗黙的に宣言されたことを示します。

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)

このオープンがモジュール宣言のソースで暗黙的に宣言されたことを示します。

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