web-dev-qa-db-ja.com

Java 9のクラスローダー階層

Java-8の時点で、クラスローダーの階層が次のようになっていることを知っています。

ブートストラップクラスローダー->拡張クラスローダー->アプリケーションクラスローダー

Java 9)のクラスローダーの階層の変更は何ですか、それはどのように機能しますか?

14
Mohit Tyagi

Java-9で改訂されたClassLoaderは次のように述べています。

Javaランタイムには、次の組み込みクラスローダーがあります:

  • Bootstrap class loader:仮想マシンの組み込みクラスローダーは通常nullとして表され、親はありません。

  • Platform class loader:プラットフォームクラスローダーに定義されたモジュールのアップグレード/オーバーライドを可能にし、アップグレードされたモジュールがプラットフォームクラスローダーとその祖先以外のクラスローダーに定義されたモジュールを読み取る場合、プラットフォームクラスローダーは、他のクラスローダー、たとえばアプリケーションクラスローダーに委譲する必要がある場合があります。 つまり、プラットフォームクラスローダーとその祖先以外のクラスローダーに定義された名前付きモジュール内のクラスは、プラットフォームクラスローダーに表示される場合があります。

  • System class loader別名アプリケーションクラスローダーであり、プラットフォームクラスローダーとは異なります。システムクラスローダーは通常、アプリケーションのクラスパス、モジュールパス、およびJDK固有のツールにクラスを定義するために定義するために使用されます。プラットフォームクラスローダーは、すべてのプラットフォームクラスが表示できるシステムクラスローダーの親または祖先です。

11
Naman

移行ガイド 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をクラスローダーとして作成するアプリケーション前述のように、親を変更する必要がある場合があります。

14
Indra Basak