Java-8の時点で、クラスローダーの階層が次のようになっていることを知っています。
ブートストラップクラスローダー->拡張クラスローダー->アプリケーションクラスローダー
Java 9)のクラスローダーの階層の変更は何ですか、それはどのように機能しますか?
Java-9で改訂されたClassLoader
は次のように述べています。
Javaランタイムには、次の組み込みクラスローダーがあります:
Bootstrap class loader
:仮想マシンの組み込みクラスローダーは通常nullとして表され、親はありません。
Platform class loader
:プラットフォームクラスローダーに定義されたモジュールのアップグレード/オーバーライドを可能にし、アップグレードされたモジュールがプラットフォームクラスローダーとその祖先以外のクラスローダーに定義されたモジュールを読み取る場合、プラットフォームクラスローダーは、他のクラスローダー、たとえばアプリケーションクラスローダーに委譲する必要がある場合があります。 つまり、プラットフォームクラスローダーとその祖先以外のクラスローダーに定義された名前付きモジュール内のクラスは、プラットフォームクラスローダーに表示される場合があります。
System class loader
:別名アプリケーションクラスローダーであり、プラットフォームクラスローダーとは異なります。システムクラスローダーは通常、アプリケーションのクラスパス、モジュールパス、およびJDK固有のツールにクラスを定義するために定義するために使用されます。プラットフォームクラスローダーは、すべてのプラットフォームクラスが表示できるシステムクラスローダーの親または祖先です。
移行ガイド Java 9、
新しいクラスローダーの実装
JDK 9は、1.2リリース以降に存在していたクラスローダーの階層を維持します。ただし、モジュールシステムを実装するために次の変更が行われました。
アプリケーションクラスローダーはURLClassLoaderのインスタンスではなく、むしろ内部クラスのインスタンスです。これは、Java SEでもJDKモジュールでもないモジュール内のクラスのデフォルトローダーです。
拡張クラスローダーがに改名されました;これはプラットフォームクラスローダーです。 Java SE Platformのすべてのクラスは、プラットフォームクラスローダーを通じて表示されることが保証されています。さらに、Javaコミュニティで標準化されているモジュールのクラスJava SEプラットフォームの一部ではなく、プロセスは、プラットフォームクラスローダーを通じて表示されることが保証されています。
クラスがプラットフォームクラスローダーから見えるからといって、そのクラスがプラットフォームクラスローダーによって実際に定義されているわけではありません。 Java SE Platformの一部のクラスは、プラットフォームクラスローダーによって定義されますが、他のクラスはbootstrapクラスローダーによって定義されます。アプリケーションは、どのクラスローダーに依存してはなりません。どのプラットフォームクラスを定義します。
JDK 9での変更は、null(bootstrap class loader))を親クラスローダーとして持つクラスローダーを作成するコードに影響を与え、すべてのプラットフォームクラスが親に可視であると想定します。親としてプラットフォームクラスローダーを使用するには、コードを変更する必要がある場合があります(ClassLoader.getPlatformClassLoaderを参照)。
プラットフォームクラスローダーは、URLClassLoaderのインスタンスではなく、内部クラスのインスタンスです。
ブートストラップクラスローダーは、Java仮想マシンに組み込まれており、ClassLoader APIではnullで表されます。 Java.baseなどのいくつかの重要なモジュールでクラスを定義します。その結果、JDK 8よりもはるかに少ないクラスが定義されるため、-Xbootclasspath/aでデプロイされるアプリケーション、またはnullをクラスローダーとして作成するアプリケーション前述のように、親を変更する必要がある場合があります。