- java.lang.Object
-
- java.lang.ModuleLayer
-
public final class ModuleLayer extends Object
Java仮想マシン内のモジュールのレイヤー。レイヤーは、
Configuration内のモジュールのグラフと、各モジュールをClassLoaderにマップする関数から作成されます。 レイヤーを作成すると、各クラスがメンバーであるモジュールをJava仮想マシンが認識できるように、モジュールからロードできるクラスがJava仮想マシンに通知されます。レイヤーを作成すると、構成内の
ResolvedModuleごとにModuleオブジェクトが作成されます。readの解決されたモジュールごとに、Modulereadsは対応するランタイムModuleであり、同じレイヤーまたはparentレイヤーにある可能性があります。defineModulesWithOneLoaderおよびdefineModulesWithManyLoadersメソッドを使用すると、モジュール・レイヤーを作成できます。モジュール・レイヤーでは、すべてのモジュールが1つのクラス・ローダーにマップされるか、各モジュールが独自のクラス・ローダーにマップされます。defineModulesメソッドは、メソッドに指定された関数によってモジュールがカスタム・クラス・ローダーにマップされる、より高度なケースを対象としています。 これらの各メソッドには、インスタンスおよび静的バリアントがあります。 インスタンス・メソッドは、受信者を親レイヤーとするレイヤーを作成します。 静的メソッドは、複数の親レイヤーが存在する場合や、レイヤー内のモジュールを制御するためにControllerが必要な場合の、より高度なメソッドです。Java仮想マシンには、Java仮想マシンの起動時に作成される空でないレイヤー
bootレイヤーが少なくとも1つあります。 ブート・レイヤーにはモジュールjava.baseが含まれ、java.baseという名前のモジュールを持つJava仮想マシンの唯一のレイヤーです。 ブート・レイヤーのモジュールは、ブートストラップ・クラス・ローダー、およびJava仮想マシンに組込みのその他のクラス・ローダーにマップされます。 ブート・レイヤーは、多くの場合、追加のレイヤーを作成するときにparentになります。レイヤー内の各
Moduleは、そのModuleDescriptorによって記述されたパッケージをexportsおよびopensするように作成されます。 修飾されたエクスポート(パッケージがすべてのモジュールではなくターゲット・モジュールのセットにエクスポートされる)は、レイヤーの作成時に次のように修正されます。- モジュール
XがパッケージをYにエクスポートし、実行時ModuleXがModuleYを読み取る場合、パッケージはModuleY(Xまたは親レイヤーと同じレイヤーにある可能性があります)にエクスポートされます。 - モジュール
XがパッケージをYにエクスポートし、実行時ModuleXがYを読み取らない場合、ターゲット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
- 関連項目:
Module.getLayer()
- モジュール
-
-
ネストされたクラスのサマリー
ネストされたクラス 修飾子と型 クラス 説明 static classModuleLayer.Controllerモジュール・レイヤーを制御します。
-
メソッドのサマリー
すべてのメソッド 静的メソッド インスタンス・メソッド 具象メソッド 修飾子と型 メソッド 説明 static ModuleLayerboot()ブートレイヤーを返します。Configurationconfiguration()このレイヤーの設定を返します。ModuleLayerdefineModules(Configuration cf, Function<String,ClassLoader> clf)指定されたConfiguration内のモジュールをJava仮想マシンに定義することで、このレイヤーを親として新しいモジュール・レイヤーを作成します。static ModuleLayer.ControllerdefineModules(Configuration cf, List<ModuleLayer> parentLayers, Function<String,ClassLoader> clf)指定されたConfiguration内のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。ModuleLayerdefineModulesWithManyLoaders(Configuration cf, ClassLoader parentLoader)指定されたConfiguration内のモジュールをJava仮想マシンに定義することで、このレイヤーを親として新しいモジュール・レイヤーを作成します。static ModuleLayer.ControllerdefineModulesWithManyLoaders(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)指定されたConfiguration内のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。ModuleLayerdefineModulesWithOneLoader(Configuration cf, ClassLoader parentLoader)指定されたConfiguration内のモジュールをJava仮想マシンに定義することで、このレイヤーを親として新しいモジュール・レイヤーを作成します。static ModuleLayer.ControllerdefineModulesWithOneLoader(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)指定されたConfiguration内のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。static ModuleLayerempty()空レイヤーを返します。ClassLoaderfindLoader(String name)指定された名前のモジュールのClassLoaderを返します。Optional<Module>findModule(String name)このレイヤーに指定された名前を持つモジュール、またはこのレイヤーにない場合は親レイヤーを返します。Set<Module>modules()このレイヤーのモジュールのセットを返します。List<ModuleLayer>parents()これが空のレイヤーで、親がないため空のリストが返されないかぎり、このレイヤーの親のリストを返します。StringtoString()このモジュール・レイヤーを説明する文字列を返します。
-
-
-
メソッドの詳細
-
defineModulesWithOneLoader
public ModuleLayer defineModulesWithOneLoader(Configuration cf, ClassLoader parentLoader)
指定されたConfiguration内のモジュールをJava仮想マシンに定義することで、このレイヤーを親として新しいモジュール・レイヤーを作成します。 このメソッドは、1つのクラス・ローダーを作成し、そのクラス・ローダーに対するすべてのモジュールを定義します。 各クラス・ローダーのparentは、指定された親クラス・ローダーです。 このメソッドは、このレイヤーを親として呼び出したときに、静的defineModulesWithOneLoaderメソッドで指定されたとおりに機能します。 つまり、このレイヤーがthisLayerの場合、このメソッドは次の呼出しと同等です。ModuleLayer.defineModulesWithOneLoader(cf, List.of(thisLayer), parentLoader).layer();- パラメータ:
cf- レイヤーの構成parentLoader- このメソッドによって作成されたクラス・ローダーの親クラス・ローダー。ブートストラップ・クラス・ローダーの場合はnull- 戻り値:
- 新しく作成したレイヤー
- 例外:
IllegalArgumentException- 指定された構成に複数の親がある場合、または構成の親がこのレイヤーの構成ではない場合LayerInstantiationException- 静的defineModulesWithOneLoaderメソッドで指定された理由のいずれかでレイヤーを作成できない場合SecurityException- セキュリティ・マネージャによってRuntimePermission("createClassLoader")またはRuntimePermission("getClassLoader")が拒否された場合- 関連項目:
findLoader(java.lang.String)
-
defineModulesWithManyLoaders
public ModuleLayer defineModulesWithManyLoaders(Configuration cf, ClassLoader parentLoader)
指定されたConfiguration内のモジュールをJava仮想マシンに定義することで、このレイヤーを親として新しいモジュール・レイヤーを作成します。 各モジュールは、このメソッドによって作成される独自のClassLoaderに定義されます。 各クラス・ローダーのparentは、指定された親クラス・ローダーです。 このメソッドは、このレイヤーを親として呼び出したときに、静的defineModulesWithManyLoadersメソッドで指定されたとおりに機能します。 つまり、このレイヤーがthisLayerの場合、このメソッドは次の呼出しと同等です。ModuleLayer.defineModulesWithManyLoaders(cf, List.of(thisLayer), parentLoader).layer();- パラメータ:
cf- レイヤーの構成parentLoader- このメソッドによって作成された各クラス・ローダーの親クラス・ローダー。ブートストラップ・クラス・ローダーの場合はnull- 戻り値:
- 新しく作成したレイヤー
- 例外:
IllegalArgumentException- 指定された構成に複数の親がある場合、または構成の親がこのレイヤーの構成ではない場合LayerInstantiationException- 静的defineModulesWithManyLoadersメソッドで指定された理由のいずれかでレイヤーを作成できない場合SecurityException- セキュリティ・マネージャによってRuntimePermission("createClassLoader")またはRuntimePermission("getClassLoader")が拒否された場合- 関連項目:
findLoader(java.lang.String)
-
defineModules
public ModuleLayer defineModules(Configuration cf, Function<String,ClassLoader> clf)
指定されたConfiguration内のモジュールをJava仮想マシンに定義することで、このレイヤーを親として新しいモジュール・レイヤーを作成します。 各モジュールは、指定された関数によって名前でクラス・ローダーにマップされます。 このメソッドは、このレイヤーを親として呼び出したときに、静的defineModulesメソッドで指定されたとおりに機能します。 つまり、このレイヤーがthisLayerの場合、このメソッドは次の呼出しと同等です。ModuleLayer.defineModules(cf, List.of(thisLayer), clf).layer();- パラメータ:
cf- レイヤーの構成clf- モジュール名をクラス・ローダーにマップする関数- 戻り値:
- 新しく作成したレイヤー
- 例外:
IllegalArgumentException- 指定された構成に複数の親がある場合、または構成の親がこのレイヤーの構成ではない場合LayerInstantiationException- 静的defineModulesメソッドで指定された理由のいずれかでレイヤーを作成できない場合SecurityException-RuntimePermission("getClassLoader")がセキュリティ・マネージャによって拒否された場合
-
defineModulesWithOneLoader
public static ModuleLayer.Controller defineModulesWithOneLoader(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)
指定されたConfiguration内のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。 このメソッドは、1つのクラス・ローダーを作成し、そのクラス・ローダーに対するすべてのモジュールを定義します。このメソッドによって作成されたクラス・ローダーは、モジュールからクラスをロードするときに直接委任を実装します。
loadClassメソッドが呼び出されてクラスがロードされる場合、クラスのパッケージ名を使用してクラスをモジュールにマップします。 これは、このレイヤーのモジュールである可能性があるため、同じクラス・ローダーに定義されます。 親レイヤーのモジュール内のパッケージであり、このレイヤーの1つ以上のモジュールにエクスポートされます。 クラス・ローダーはモジュールのクラス・ローダーに委譲し、そのクラス・ローダーで見つからない場合はClassNotFoundExceptionをスローします。 モジュールにマップされないクラスをロードするためにloadClassが呼び出されると、親クラス・ローダーに委譲されます。このメソッドによって作成されたクラス・ローダーは、親クラス・ローダーを検索する前に、レイヤー内のすべてのモジュール内のリソース(
getResource、getResourcesおよびその他のリソース・メソッド)を特定します。同じクラス・ローダーに定義されたすべてのモジュールでレイヤーを作成しようとすると、次の理由で失敗する可能性があります。
重複するパッケージ: 構成内の2つ以上のモジュールが同じパッケージを持ちます。
分割委任: 結果のクラス・ローダーは、特定のパッケージにクラスをロードするために、複数のクラス・ローダーに委任する必要があります。
また、構成に"
java.base"という名前のモジュールが含まれている場合、またはモジュールに"java"という名前のパッケージが含まれている場合、または"java."で始まる名前のパッケージが含まれている場合は、レイヤーを作成できません。セキュリティ・マネージャが存在する場合、このメソッドによって作成されたクラス・ローダーは、このメソッドのコール・コンテキストによって制限された権限を持つクラスおよびリソースをロードします。
- パラメータ:
cf- レイヤーの構成parentLayers- 検索順の親レイヤーのリストparentLoader- このメソッドによって作成されたクラス・ローダーの親クラス・ローダー。ブートストラップ・クラス・ローダーの場合はnull- 戻り値:
- 新しく作成したレイヤーを制御するコントローラ
- 例外:
IllegalArgumentException- 指定された構成の親が、順序を含む親レイヤーの構成と一致しない場合LayerInstantiationException- 前述のいずれかの理由で、すべてのモジュールを同じクラス・ローダーに定義できない場合SecurityException- セキュリティ・マネージャによってRuntimePermission("createClassLoader")またはRuntimePermission("getClassLoader")が拒否された場合- 関連項目:
findLoader(java.lang.String)
-
defineModulesWithManyLoaders
public static ModuleLayer.Controller defineModulesWithManyLoaders(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader)
指定されたConfiguration内のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。 各モジュールは、このメソッドによって作成される独自のClassLoaderに定義されます。 各クラス・ローダーのparentは、指定された親クラス・ローダーです。このメソッドによって作成されたクラス・ローダーは、モジュールからクラスをロードするときに直接委任を実装します。
loadClassメソッドが呼び出されてクラスがロードされる場合、クラスのパッケージ名を使用してクラスをモジュールにマップします。 パッケージは、クラス・ローダーに定義されたモジュール内にある場合があります。 パッケージは、このレイヤーの別のモジュールによって、クラス・ローダーに定義されたモジュールにエクスポートできます。 親レイヤーのモジュールによってエクスポートされたパッケージ内にある場合があります。 クラス・ローダーはモジュールのクラス・ローダーに委譲し、そのクラス・ローダーで見つからない場合はClassNotFoundExceptionをスローします。 モジュールにマップされないクラスをロードするためにloadClassが呼び出されると、親クラス・ローダーに委譲されます。このメソッドによって作成されたクラス・ローダーは、親クラス・ローダーを検索する前に、クラス・ローダーに定義されたモジュール内のリソース(
getResource、getResourcesおよびその他のリソース・メソッド)を特定します。セキュリティ・マネージャが存在する場合、このメソッドによって作成されたクラス・ローダーは、このメソッドのコール・コンテキストによって制限された権限を持つクラスおよびリソースをロードします。
- パラメータ:
cf- レイヤーの構成parentLayers- 検索順の親レイヤーのリストparentLoader- このメソッドによって作成された各クラス・ローダーの親クラス・ローダー。ブートストラップ・クラス・ローダーの場合はnull- 戻り値:
- 新しく作成したレイヤーを制御するコントローラ
- 例外:
IllegalArgumentException- 指定された構成の親が、順序を含む親レイヤーの構成と一致しない場合LayerInstantiationException- 構成に"java.base"という名前のモジュールが含まれているか、モジュールに"java"という名前のパッケージが含まれているか、または"java."で始まる名前のパッケージが含まれているためにレイヤーを作成できない場合SecurityException- セキュリティ・マネージャによってRuntimePermission("createClassLoader")またはRuntimePermission("getClassLoader")が拒否された場合- 関連項目:
findLoader(java.lang.String)
-
defineModules
public static ModuleLayer.Controller defineModules(Configuration cf, List<ModuleLayer> parentLayers, Function<String,ClassLoader> clf)
指定されたConfiguration内のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。 指定された関数は、構成内の各モジュールを名前でクラス・ローダーにマップします。 レイヤーを作成すると、各クラスがメンバーであるモジュールをJava仮想マシンが認識できるように、ロード可能なクラスがJava仮想マシンに通知されます。クラス・ローダーによって実装されるクラス・ローダーの委譲は、モジュールの可読性を考慮する必要があります。 クラス・ロード中のデッドロックを回避するために、クラス・ローダーは
parallel-capableである必要があります。 さらに、このメソッドで新しいレイヤーを作成するエンティティは、クラスまたはリソースのロードを試行する前に、これらのモジュールからクラス・ローダーをロードする準備を整える必要があります。レイヤーの作成は、次の理由で失敗することがあります。
同じパッケージを持つ2つ以上のモジュールが同じクラス・ローダーにマップされます。
モジュールは、すでに同じ名前のモジュールが定義されているクラス・ローダーにマップされます。
モジュールは、モジュール内のいずれかのパッケージにすでに型が定義されているクラス・ローダーにマップされます。
また、構成に"
java.base"という名前のモジュールが含まれている場合、構成に"java"という名前のパッケージがあるモジュール、または"java."で始まるパッケージ名があるモジュールが含まれている場合、またはモジュール名をクラス・ローダーにマップするファンクションがnullまたはプラットフォーム・クラス・ローダーを返す場合、レイヤーを作成できません。モジュール名をクラス・ローダーにマップする関数がエラーまたは実行時例外をスローすると、このメソッドのコール元に伝播されます。
- APIのノート:
- このメソッドを使用してレイヤーを作成することがアトミック操作かどうかに関する実装に固有です。 したがって、このメソッドは、Java仮想マシンに定義されているモジュール(すべてではない)の一部で失敗する可能性があります。
- パラメータ:
cf- レイヤーの構成parentLayers- 検索順の親レイヤーのリストclf- モジュール名をクラス・ローダーにマップする関数- 戻り値:
- 新しく作成したレイヤーを制御するコントローラ
- 例外:
IllegalArgumentException- 指定された構成の親が、順序を含む親レイヤーの構成と一致しない場合LayerInstantiationException- 前述のいずれかの理由でレイヤーの作成に失敗した場合SecurityException-RuntimePermission("getClassLoader")がセキュリティ・マネージャによって拒否された場合
-
configuration
public Configuration configuration()
このレイヤーの設定を返します。- 戻り値:
- このレイヤーの設定
-
parents
public List<ModuleLayer> parents()
これが空のレイヤーで、親がないため空のリストが返されないかぎり、このレイヤーの親のリストを返します。- 戻り値:
- このレイヤーの親のリスト
-
findModule
public Optional<Module> findModule(String name)
このレイヤーに指定された名前を持つモジュール、またはこのレイヤーにない場合は親レイヤーを返します。 親レイヤーでのモジュールの検索は、モジュールが見つかるか、すべての親が検索されるまで、各親に対するfindModuleの検索順での呼出しと同等です。 レイヤーのツリーでは、これは深さ優先の検索と同等です。- パラメータ:
name- 検索するモジュールの名前- 戻り値:
- このレイヤーまたは親レイヤーにこの名前のモジュールが存在しない場合は、指定された名前のモジュールまたは空の
Optional
-
findLoader
public ClassLoader findLoader(String name)
指定された名前のモジュールのClassLoaderを返します。 指定された名前のモジュールがこのレイヤーにない場合、parentレイヤーはfindModuleで指定された方法で検索されます。セキュリティ・マネージャが存在する場合は、その
checkPermissionメソッドがRuntimePermission("getClassLoader")権限でコールされ、コール元がクラス・ローダーへのアクセスを許可されているかどうかがチェックされます。- APIのノート:
- ブートストラップ・クラス・ローダーを表すには'null'を使用する必要があるため、このメソッドは
Optional<ClassLoader>を返しません。 - パラメータ:
name- 検索するモジュールの名前- 戻り値:
- モジュールが定義されるClassLoader
- 例外:
IllegalArgumentException- 指定された名前のモジュールがこのレイヤーまたはこのレイヤーの親で定義されていない場合SecurityException- セキュリティ・マネージャによって拒否された場合
-
toString
public String toString()
このモジュール・レイヤーを説明する文字列を返します。
-
empty
public static ModuleLayer empty()
空レイヤーを返します。 空のレイヤーにモジュールがありません。 親がいない。- 戻り値:
- 空のレイヤー
-
boot
public static ModuleLayer boot()
- APIのノート:
- このメソッドは、起動時およびブート・レイヤーが完全に初期化される前に
nullを返します。 - 戻り値:
- ブート・レイヤー
-
-