モジュール java.base

パッケージjava.lang.module


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

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

モジュールの解決

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

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

ステップ1: 再帰的列挙

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

  • 'requires'ディレクティブが'transitive'修飾子で指定したモジュール名

  • ホスト・システムの判断で、「transitive」修飾子なしで「requires」ディレクティブで指定されたモジュール名。

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

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

このアルゴリズムによって少なくとも1つの自動モジュールが列挙されている場合は、明示的なモジュール宣言のrequiresディレクティブによって名前が指定されているかどうかに関係なく、すべての監視可能な自動モジュールを列挙する必要があります。

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

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

  • 'transitive'修飾子を持つ'requires'ディレクティブによって名前が指定されたモジュールは、監視できません。

  • ホスト・システムの判断では、「transitive」修飾子なしで「requires」ディレクティブによって名前が指定されているモジュールは監視できません。

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

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

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

「requires」ディレクティブ(>「transitive」の意味)は、1つのモジュールが他のモジュールに依存していることを表します。 「推移的」修飾子の効果は、追加のモジュールがほかのモジュールにも依存するようにすることです。 モジュールMが推移的Nを必要とする場合、MはNに依存するだけでなく、Mに依存するモジュールもNに依存します。 これにより、Mをリファクタリングして、Mを必要とするディレクティブを持つモジュールを壊すことなく、その内容の一部またはすべてを新しいモジュールNに移動できるようにします。

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

まず、読みやすさは列挙されたモジュールのrequiresディレクティブによって決定され、transitive修飾子は無視されます:

  • Bを必要とする列挙モジュールAごとに: "reads" B.

  • 列挙された各モジュールXに対して、自動: X "reads"他の列挙モジュール(自動モジュールには、他のすべての列挙モジュールに対して「requires」ディレクティブがある"かのように"です)。

次に、読みやすさが「推移的」修飾子を考慮するように拡張されます:

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

    • Bが推移的Cを必要とする場合、AはBと同様に"reads" Cになります。 この拡張は再帰的です: 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つのパッケージがエクスポートされます。

Observableモジュール

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

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

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

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

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

'requires'ディレクティブと'static'修飾子

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

完全性

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

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

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