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

クラスModuleLayer


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

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

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

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

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

    レイヤー内の各Moduleは、そのModuleDescriptorによって記述されたパッケージをexportsおよびopensするように作成されます。 修飾されたエクスポート(パッケージがすべてのモジュールではなくターゲット・モジュールのセットにエクスポートされる)は、レイヤーの作成時に次のように修正されます。

    • モジュール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
    関連項目:
    Module.getLayer()
    • メソッドの詳細

      • 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が呼び出されると、親クラス・ローダーに委譲されます。

        このメソッドによって作成されたクラス・ローダーは、親クラス・ローダーを検索する前に、レイヤー内のすべてのモジュール内のリソース(getResourcegetResourcesおよびその他のリソース・メソッド)を特定します。

        同じクラス・ローダーに定義されたすべてのモジュールでレイヤーを作成しようとすると、次の理由で失敗する可能性があります。

        • 重複するパッケージ: 構成内の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が呼び出されると、親クラス・ローダーに委譲されます。

        このメソッドによって作成されたクラス・ローダーは、親クラス・ローダーを検索する前に、クラス・ローダーに定義されたモジュール内のリソース(getResourcegetResourcesおよびその他のリソース・メソッド)を特定します。

        セキュリティ・マネージャが存在する場合、このメソッドによって作成されたクラス・ローダーは、このメソッドのコール・コンテキストによって制限された権限を持つクラスおよびリソースをロードします。

        パラメータ:
        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()
        これが空のレイヤーで、親がないため空のリストが返されないかぎり、このレイヤーの親のリストを返します。
        戻り値:
        このレイヤーの親のリスト
      • modules

        public Set<Module> modules()
        このレイヤーのモジュールのセットを返します。
        戻り値:
        このレイヤー内の変更不可の可能性があるモジュールのセット
      • 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()
        このモジュール・レイヤーを説明する文字列を返します。
        オーバーライド:
        toString、クラスObject
        戻り値:
        このモジュール・レイヤーを説明する空の文字列である可能性があります
      • empty

        public static ModuleLayer empty()
        レイヤーを返します。 空のレイヤーにモジュールがありません。 親がいない。
        戻り値:
        空のレイヤー
      • boot

        public static ModuleLayer boot()
        ブートレイヤーを返します。 ブート・レイヤーには、少なくとも1つのモジュールjava.baseが含まれています。 その親はemptyレイヤーです。
        APIのノート:
        このメソッドは、起動時およびブート・レイヤーが完全に初期化される前にnullを返します。
        戻り値:
        ブート・レイヤー