モジュール java.base

パッケージjava.lang.module


パッケージjava.lang.module
モジュール記述子をサポートし、解決とサービス・バインディングによってモジュールの構成を作成するクラス。

特に指定がないかぎり、このパッケージ内のクラスまたはインタフェースのメソッドやコンストラクタにnull引数を渡すと、NullPointerExceptionがスローされます。 さらに、null要素を含む配列またはコレクションを持つメソッドを呼び出すと、特に指定がない限り、NullPointerExceptionが発生します。

モジュールの解決

解決策は、モジュールが互いにどのように依存するかを計算するプロセスです。 プロセスはコンパイル時と実行時に発生します。

解決は2段階のプロセスです。 最初のステップでは、一連のルート・モジュールの'requires'ディレクティブを再帰的に列挙します。 すべての列挙されたモジュールが観測可能である場合、第2ステップは可読性グラフを計算します。 可読性グラフは、モジュールが互いにどのように依存しているかを表しており、モジュール境界をまたいでアクセスを制御します。

ステップ1: 再帰的列挙

再帰的列挙は、一連のモジュール名を取り、それぞれのモジュール宣言を検索し、各モジュール宣言に対して再帰的に列挙します:

  • 'requires'修飾子を使用して'requires'ディレクティブによって指定されたモジュール名

  • ホスト・システムの裁量で、'transitive'修飾子を付けずに'requires'ディレクティブによって指定されたモジュール名を指定します。

モジュール宣言は、観測可能なモジュールのセットで参照されます。 観察可能なモジュールのセットは、実装固有の方法で決定されます。 観測可能なモジュールのセットには、明示的な宣言を持つモジュール(つまり、module-info.javaソース・ファイルまたはmodule-info.classファイル)と暗黙の宣言を持つモジュール(つまり、「自動モジュール」)が含まれています。 自動モジュールには明示的なモジュール宣言がないので、明示的なモジュール宣言の'requires'ディレクティブによってその名前が与えられるかもしれませんが、それ自体の'requires'指令はありません。

名前がこのアルゴリズムの初期入力であるルート・モジュールのセットは、実装固有の方法で決定されます。 ルート・モジュールのセットは、自動モジュールを含むことができます。

少なくとも1つの自動モジュールがこのアルゴリズムで列挙されている場合、明示的なモジュール宣言の'requires'ディレクティブによって名前が与えられているかどうかにかかわらず、観測可能なすべての自動モジュールを列挙する必要があります。

次のいずれかの条件が発生すると、解決に失敗します:

  • どのルート・モジュールも観測できません。

  • 'transitive'修飾子を付けた'requires'ディレクティブ文で指定された名前のモジュールは観測できません。

  • ホスト・システムの裁量で、'transitive'修飾子を付けずに'requires'ディレクティブによって指定されたモジュールは観測できません。

  • このステップのアルゴリズムは、同じモジュール名を2回列挙します。 これは、'requires'修飾子を無視して、'requires'ディレクティブのサイクルを示します。

それ以外の場合は、ステップ2に進みます。

ステップ2: 可読性グラフの計算

'requires'ディレクティブ('transitive'に関係なく)は、あるモジュールが他のモジュールに依存していることを表しています。 'transitive'修飾子の効果は、追加のモジュールを他のモジュールに依存させることです。 モジュールM '推移的Nを必要とします'であれば、MはNに依存するだけでなく、Mに依存するモジュールもNに依存します。 これにより、Mのリファクタ・リングが可能になり、'Mが必要'ディレクティブを持つモジュールを中断することなく、コンテンツの一部またはすべてを新しいモジュールNに移動できます。

モジュールの依存関係は、可読性グラフで表されます。 可読性グラフは、頂点がステップ1で列挙されたモジュールであり、エッジがモジュールのペア間の可読性を表す有向グラフです。 エッジは次のように指定されます:

まず、'transitive'修飾子を無視して、列挙モジュールの'requires'ディレクティブによって可読性が決まります:

  • 列挙された各モジュールAに対して、'requires' B: "reads" B.

  • 列挙された各モジュールXに対して、自動: 他のすべての列挙されたモジュール(自動モジュールには、列挙されたモジュールごとに'requires'ディレクティブが含まれています)。

次に、'transitive'修飾語を考慮して可読性を向上させます:

  • 列挙された各モジュールAについて、その"reads" B:

    • B '推移性が必要' Cならば、A "reads" CとB. この拡張は再帰的です: A "reads" C、C '推移性が必要' Dならば、A "reads" DとCとB。

    • Bが自動モジュールの場合、列挙された自動モジュールごとに1つのモジュールが追加されます。 (自動モジュールには、列挙されたすべての自動モジュール用のディレクティブがありません。)。

最後に、すべてのモジュール"reads"自体。

可読性グラフに次のいずれかの条件が発生した場合、解決は失敗します:

  • 同じ名前の2つ以上のモジュールを作成するモジュール。 これには、モジュール"reads"が別名と同じ名前で他のモジュールをパケット化するケースも含まれます。

  • 2つ以上のモジュールは、同じ名前のパッケージを"reads"モジュールにエクスポートします。 これには、パッケージpを含むモジュールMがpにMをエクスポートする別のモジュールを公開するケースも含まれます。

  • モジュールMはそれが'p.Sを使用'または'p.Sを提供...'であると宣言しますが、パッケージpはモジュールMでもなく、M "reads"のいずれかのモジュールによってMにエクスポートされません。

それ以外の場合、解決は成功し、解決の結果は可読性グラフになります。

ルート・モジュール

コンパイル時のルート・モジュールのセットは、通常、コンパイルされるモジュールのセットです。 実行時に、ルート・モジュールのセットは、通常、'java'ランチャに指定されたアプリケーション・モジュールです。 名前のないモジュールでコードをコンパイルする場合、またはメイン・アプリケーション・クラスがクラス・パスからロードされる場合、実行時にルート・モジュールのデフォルト・セットは実装固有です。 JDKでは、ルート・モジュールのデフォルト・セットには、アップグレード・モジュール・パスまたはシステム・モジュール間で監視可能なすべてのモジュールが含まれ、資格なしで少なくとも1つのパッケージがエクスポートされます。

観測可能なモジュール

コンパイル時および実行時の観測可能なモジュールのセットは、いくつかの異なるパスを検索し、環境に組み込まれたコンパイル済みモジュールを検索することによって決定されます。 検索順序は、次のとおりです。

  1. コンパイル時のみ、コンパイル・モジュールのパス。 このパスには、ソース形式のモジュール定義が含まれています。

  2. アップグレード・モジュールのパス。 このパスには、(3)と(4)に存在する「アップグレード可能なモジュール」のコンパイル済み定義に優先して観察されるモジュールのコンパイル済み定義が含まれています。 アップグレード可能な標準モジュールの指定については、Java SEプラットフォームを参照してください。

  3. システム・モジュール。環境に組み込まれたコンパイル済みの定義です。

  4. アプリケーション・モジュールのパス。 このパスには、ライブラリ・モジュールとアプリケーション・モジュールのコンパイル済みの定義が含まれています。

'requires'修飾子付きの'requires'ディレクティブ

'requires'修飾子を持つ'requires'ディレクティブは、実行時にオプションの依存関係を表します。 モジュールが'静的なMを必要とします'であると宣言した場合、解決は依存性を満たすために観測可能なモジュールをMで検索しません。 しかし、ステップ1でMを再帰的に列挙すると、列挙され、`静的Mを必要とするすべてのモジュールはMを読む。

完全性

モジュールの集合をコンパイルするために完全な推移的閉包が必要とされないという点で、コンパイル時には分解能が部分的である可能性があります。 コンパイル時に構築され、検証される可読性グラフには、コンパイルされるモジュール、その直接依存関係、および暗黙的に宣言された依存関係がすべて含まれています。(推移性が必要)。

実行時には、分解能は付加的なプロセスです。 ステップ1の再帰的列挙は、前の(または親)解決法で列挙されたときにルート・モジュールまたは'requires'ディレクティブで指定されたモジュールが列挙されないように、以前の解決策との相対的なものであってもよい。 したがって、解像度の結果である可読性グラフには、ステップ1で列挙されたモジュールの頂点がありますが、前の(または親)解像度で列挙されたモジュールをモジュールが読み取ることを表すエッジがあります。

導入されたバージョン:
9