レイヤーは、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
で記述されたパッケージをexports
とopens
が作成するように作成されます。 修飾されるエクスポート(パッケージがすべてのモジュールではなくターゲット・モジュールのセットにエクスポートされる)は、次のようにレイヤーを作成するときに具象化されます:
- モジュール
X
がパッケージをY
にエクスポートし、ランタイムModule
X
がModule
Y
を読み取る場合、パッケージはModule
Y
(これはX
と同じレイヤーまたは親レイヤーにあります)にエクスポートされます。 - モジュール
X
がパッケージをY
にエクスポートし、実行時Module
X
が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
- 関連項目:
-
ネストされたクラスのサマリー
ネストされたクラス -
メソッドのサマリー
修飾子と型メソッド説明static ModuleLayer
boot()
ブート・レイヤーを返します。このレイヤーの構成を返します。defineModules
(Configuration cf, Function<String, ClassLoader> clf) 指定されたConfiguration
のモジュールをJava仮想マシンに定義することで、このレイヤーを親として、新しいモジュール・レイヤーを作成します。static ModuleLayer.Controller
defineModules
(Configuration cf, List<ModuleLayer> parentLayers, Function<String, ClassLoader> clf) 指定されたConfiguration
のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。defineModulesWithManyLoaders
(Configuration cf, ClassLoader parentLoader) 指定されたConfiguration
のモジュールをJava仮想マシンに定義することで、このレイヤーを親として、新しいモジュール・レイヤーを作成します。static ModuleLayer.Controller
defineModulesWithManyLoaders
(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader) 指定されたConfiguration
のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。defineModulesWithOneLoader
(Configuration cf, ClassLoader parentLoader) 指定されたConfiguration
のモジュールをJava仮想マシンに定義することで、このレイヤーを親として、新しいモジュール・レイヤーを作成します。static ModuleLayer.Controller
defineModulesWithOneLoader
(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader) 指定されたConfiguration
のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。static ModuleLayer
empty()
emptyレイヤーを返します。findLoader
(String name) 指定された名前のモジュールのClassLoader
を返します。findModule
(String name) このレイヤー内の指定された名前を持つモジュール、またはこのレイヤー内にない場合はparentレイヤーを返します。modules()
このレイヤー内のモジュールの変更不可能なセットを返します。parents()
このレイヤーの親の変更不可能なリストを検索順に返します。toString()
このモジュール・レイヤーを説明する文字列を返します。
-
メソッドの詳細
-
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")
がセキュリティ・マネージャによって拒否された場合- 関連項目:
-
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")
がセキュリティ・マネージャによって拒否された場合- 関連項目:
-
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
- 指定された構成のtheparent(s)が、順序を含む親レイヤーの構成と一致しない場合LayerInstantiationException
- 上記のいずれかの理由により、すべてのモジュールを同じクラス・ローダーに定義できない場合SecurityException
-RuntimePermission("createClassLoader")
またはRuntimePermission("getClassLoader")
がセキュリティ・マネージャによって拒否された場合- 関連項目:
-
defineModulesWithManyLoaders
public static ModuleLayer.Controller defineModulesWithManyLoaders(Configuration cf, List<ModuleLayer> parentLayers, ClassLoader parentLoader) 指定されたConfiguration
のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。 各モジュールは、このメソッドによって作成された独自のClassLoader
に定義されます。 各クラス・ローダーのparent
は、指定された親クラス・ローダーです。このメソッドで作成されたクラス・ローダーは、モジュールからクラスをロードするときに「直接委任」を実装します。 クラスをロードするために
loadClass
メソッドが呼び出された場合、クラスのパッケージ名を使用してクラスにモジュールをマップします。 パッケージは、クラス・ローダーに定義されているモジュール内にある場合があります。 パッケージは、このレイヤーの別のモジュールによって、クラス・ローダーに定義されているモジュールにエクスポートできます。 これは、親レイヤーのモジュールによってエクスポートされたパッケージに含まれる場合があります。 クラス・ローダーはモジュールのクラス・ローダーに委任し、そのクラス・ローダーで見つからない場合はClassNotFoundException
をスローします。 モジュールにマップされないクラスをロードするためにloadClass
が呼び出されると、親クラス・ローダーに委譲されます。このメソッドで作成されたクラス・ローダーは、親クラス・ローダーを検索する前にクラス・ローダーに定義されたモジュールのresources (
getResource
、getResources
およびその他のリソース・メソッド)を探します。セキュリティ・マネージャが存在する場合、このメソッドによって作成されたクラス・ローダーは、このメソッドのコール・コンテキストによって制限される権限を持つクラスおよびリソースをロードします。
- パラメータ:
cf
- レイヤーの構成parentLayers
- 検索順序の親レイヤーのリストparentLoader
- このメソッドで作成された各クラス・ローダーの親クラス・ローダー; ブートストラップ・クラス・ローダー用はnull
かもしれません- 戻り値:
- 新しく作成されたレイヤーを制御するコントローラ
- 例外:
IllegalArgumentException
- 指定された構成のtheparent(s)が、順序を含む親レイヤーの構成と一致しない場合LayerInstantiationException
- 構成に"java.base
"という名前のモジュールが含まれているか、"java
"という名前のパッケージまたは"java.
"で始まる名前のパッケージがモジュールに含まれているため、レイヤーを作成できない場合SecurityException
-RuntimePermission("createClassLoader")
またはRuntimePermission("getClassLoader")
がセキュリティ・マネージャによって拒否された場合- 関連項目:
-
defineModules
public static ModuleLayer.Controller defineModules(Configuration cf, List<ModuleLayer> parentLayers, Function<String, ClassLoader> clf) 指定されたConfiguration
のモジュールをJava仮想マシンに定義して、新しいモジュール・レイヤーを作成します。 指定された関数は、構成内の各モジュールを名前でクラス・ローダーにマップします。 レイヤーを作成すると、ロード可能なクラスがJava仮想マシンに通知され、各クラスがメンバーであるモジュールがJava仮想マシンで認識されます。クラス・ローダーによって実装されるクラス・ローダー委任は、モジュールの可読性を考慮する必要があります。 クラス・ロード中のデッドロックを回避するために、クラス・ローダーは
parallel-capable
である必要があります。 さらに、このメソッドで新しいレイヤーを作成するエンティティは、クラスまたはリソースのロードを試みる前に、これらのモジュールからクラス・ローダーをロードする準備が整っているように整える必要があります。レイヤーの作成に失敗する理由は次のとおりです:
同じパッケージを持つ複数のモジュールが同じクラス・ローダーにマップされます。
モジュールは、同じ名前のモジュールがすでに定義されているクラス・ローダーにマップされます。
モジュールは、モジュール内のいずれかのパッケージにすでに型が定義されているクラス・ローダーにマップされます。
さらに、構成に"
java.base
"という名前のモジュール、構成に"java
"という名前のパッケージまたは"java.
"で始まるパッケージ名を含むモジュール、またはモジュール名をクラス・ローダーにマップするファンクションがnull
または「プラットフォーム・クラス・ローダー」を返す場合、レイヤーを作成できません。モジュール名をクラス・ローダーにマップする関数がエラーまたは実行時例外をスローすると、このメソッドの呼出し側に伝播されます。
- APIのノート:
- このメソッドを使用してレイヤーを作成することが不可分操作であるかどうかについては、実装に固有です。 その結果、Java仮想マシンに定義されている一部のモジュール(すべてではない)でこのメソッドが失敗する可能性があります。
- パラメータ:
cf
- レイヤーの構成parentLayers
- 検索順序の親レイヤーのリストclf
- モジュール名をクラス・ローダーにマップする関数- 戻り値:
- 新しく作成されたレイヤーを制御するコントローラ
- 例外:
IllegalArgumentException
- 指定された構成のtheparent(s)が、順序を含む親レイヤーの構成と一致しない場合LayerInstantiationException
- 上記のいずれかの理由でレイヤーの作成に失敗した場合SecurityException
-RuntimePermission("getClassLoader")
がセキュリティ・マネージャによって拒否された場合
-
configuration
-
parents
public List<ModuleLayer> parents()このレイヤーの親の変更不可能なリストを検索順に返します。 これが「空の層」の場合は、空のリストが返されます。- 戻り値:
- このレイヤー親の変更不可能なリスト(空の可能性あり)
-
modules
-
findModule
-
findLoader
public ClassLoader findLoader(String name) 指定された名前のモジュールのClassLoader
を返します。 指定された名前のモジュールがこの層にない場合、parent
層はfindModule
で指定された方法で検索されます。セキュリティ・マネージャが存在する場合は、その
checkPermission
メソッドがRuntimePermission("getClassLoader")
権限でコールされ、コール元がクラス・ローダーへのアクセスを許可されていることが確認されます。- APIのノート:
- `null`はブートストラップ・クラス・ローダーを表すために使用する必要があるため、このメソッドは
Optional<ClassLoader>
を返しません。 - パラメータ:
name
- 検索するモジュールの名前- 戻り値:
- モジュールが定義されているClassLoader。
- 例外:
IllegalArgumentException
- 指定された名前のモジュールがこのレイヤーまたはこのレイヤーのいずれかの親に定義されていない場合SecurityException
- セキュリティ・マネージャによって拒否された場合
-
toString
-
empty
-
boot
public static ModuleLayer boot()- APIのノート:
- このメソッドは、起動時およびブート・レイヤーが完全に初期化される前に
null
を返します。 - 戻り値:
- ブート層
-