モジュール java.base
パッケージ java.lang

クラスModuleLayer

java.lang.Object
java.lang.ModuleLayer

public final class ModuleLayer extends Object
Java仮想マシンのモジュールのレイヤー。

レイヤーは、Configuration内のモジュールのグラフから作成され、各モジュールをClassLoaderにマップする関数です。 レイヤーを作成すると、各クラスがメンバーであるモジュールをJava仮想マシンが認識できるように、モジュールからロードできるクラスがJava仮想マシンに通知されます。

レイヤーを作成すると、構成内のResolvedModuleごとにModuleオブジェクトが作成されます。 readの解決済モジュールごとに、Module readsは対応するランタイムModuleです。これは、同じレイヤーまたはparentレイヤーにある場合があります。

defineModulesWithOneLoaderおよびdefineModulesWithManyLoadersメソッドは、すべてのモジュールが単一のクラス・ローダーにマップされるか、各モジュールが独自のクラス・ローダーにマップされるモジュール・レイヤーを作成する便利な方法を提供します。 defineModulesメソッドは、メソッドに指定された関数によってモジュールがカスタム・クラス・ローダーにマップされる、より高度な場合に使用します。 これらの各メソッドには、インスタンスおよび静的バリアントがあります。 インスタンス・メソッドは、レシーバを親レイヤーとするレイヤーを作成します。 静的メソッドは、複数の親レイヤーが存在する可能性がある、またはレイヤー内のモジュールを制御するためにControllerが必要な、より高度なケース用です

Java仮想マシンには、Java仮想マシンの起動時に作成される、空でないレイヤー(bootレイヤー)が少なくとも1つあります。 ブート・レイヤーにはモジュールjava.baseが含まれ、"java.base"という名前のモジュールを持つJava仮想マシンの唯一のレイヤーです。 ブート・レイヤーのモジュールは、ブートストラップ・クラス・ローダーと、built-inである他のクラス・ローダーにJava仮想マシンにマップされます。 追加のレイヤーを作成する場合、ブート・レイヤーはparentになることがよくあります。

レイヤー内の各Moduleは、そのModuleDescriptorで記述されたパッケージをexportsopensが作成するように作成されます。 修飾されるエクスポート(パッケージがすべてのモジュールではなくターゲット・モジュールのセットにエクスポートされる)は、次のようにレイヤーを作成するときに具象化されます:

  • モジュールXがパッケージをYにエクスポートし、ランタイムModule XModule Yを読み取る場合、パッケージはModule Y (これはXと同じレイヤーまたは親レイヤーにあります)にエクスポートされます。
  • モジュールXがパッケージをYにエクスポートし、実行時Module XYを読み取らない場合、ターゲットYは、findModuleを呼び出してレイヤーまたはその親レイヤー内のモジュールを検索するかのように配置されます。 Yが見つかった場合、パッケージは見つかったYのインスタンスにエクスポートされます。 Yが見つからない場合、修飾されたエクスポートは無視されます。

適格なオープンは、適格なエクスポートと同様に処理されます。

Configurationを作成する場合と同様に、automaticモジュールはレイヤーの作成時に特別な処理を受けます。 自動モジュールは、Java仮想マシン内の名前のない Moduleをすべて読み取るModuleとして、Java仮想マシンに作成されます。

特に指定しないかぎり、このクラスのメソッドにnull引数を渡すと、NullPointerExceptionがスローされます。

この例では、"myapp"という名前のモジュールを、ブート・レイヤーの構成を親として解決することで構成を作成します。 次に、この構成内のモジュールを使用して新しいレイヤーを作成します。 すべてのモジュールは同じクラス・ローダーに定義されます。

    ModuleFinder finder = ModuleFinder.of(dir1, dir2, dir3);
    ModuleLayer parent = ModuleLayer.boot();
    Configuration cf = parent.configuration()
                             .resolve(finder, ModuleFinder.of(), Set.of("myapp"));
    ClassLoader scl = ClassLoader.getSystemClassLoader();
    ModuleLayer layer = parent.defineModulesWithOneLoader(cf, scl);
    Class<?> c = layer.findLoader("myapp").loadClass("app.Main");
導入されたバージョン:
9
関連項目: