Java 9におけるクラスローダーの変更点を徹底解説
すべてのJavaプログラムはJava仮想マシン(JVM)上で実行されます。コンパイル後、Javaのクラスはプラットフォームやマシンに依存しないバイトコードへと変換され、.classファイルとして保存されます。クラスを使用する際には、ClassLoader(クラスローダー)がそのクラスをメモリに読み込みます。クラスは名前によって参照された時点でJava環境に導入され、クラスの実行開始時にクラスローダーによるロードが行われます。main()メソッドは、そのクラスを起動するためのエントリーポイントです。
Java 9では、このクラスローダーに関していくつかの重要な変更が加えられました。以下に主な変更点をまとめます。
Java 9でのクラスローダーの主な変更点
- システムクラスローダーは、Java 9ではURLClassLoaderのインスタンスではなくなり、JDK内部のクラスになりました。モジュール内のクラスに対するデフォルトのローダーとして機能します。
- 拡張クラスローダー(Extension Class Loader)はプラットフォームクラスローダー(Platform Class Loader)に改名されました。Java SEプラットフォームのすべてのクラスはプラットフォームクラスローダーから参照可能であり、さらにJCP(Java Community Process)で策定されたモジュールのうち、Java SEプラットフォームには含まれないクラスについても参照できます。
- アプリケーション側は、Java SEプラットフォームの一部のクラスがプラットフォームクラスローダーによって定義され、その他がブートストラップクラスローダーによって定義されるという実装の詳細に依存することはできません。
- 既存のコードでブートストラップクラスローダーを親としてクラスローダーを作成している場合は、親としてプラットフォームクラスローダーを使用するように変更が必要です。
- プラットフォームクラスローダーもURLClassLoaderのインスタンスではなく、JDK内部のクラスとして実装されています。
- ブートストラップクラスローダーはJVMに組み込まれたビルトインクラスローダーであり、java.baseなどの重要なモジュールのクラスを定義します。-Xbootclasspath/aオプションを使ってデプロイされたアプリケーションや、親としてnullを指定してクラスローダーを作成しているアプリケーションは、修正が必要になる場合があります。
サンプルコード
public class ClassLoaderTest {
public static void main(String args[]) {
System.out.println("Class Loader Test");
ClassLoaderTest test = new ClassLoaderTest();
try {
test.showClassLoaders();
} catch(ClassNotFoundException cnfe) {
System.out.println(cnfe.getMessage());
}
}
public void showClassLoaders() throws ClassNotFoundException {
System.out.println("Classloader of this class: " + ClassLoaderTest.class.getClassLoader());
System.out.println("Classloader of Permission: " + java.sql.SQLPermission.class.getClassLoader());
System.out.println("Classloader of LinkedList: " + java.util.LinkedList.class.getClassLoader());
return;
}
}実行結果
Class Loader Test Classloader of this class: jdk.internal.loader.ClassLoaders$AppClassLoader@504bae78 Classloader of Permission: jdk.internal.loader.ClassLoaders$PlatformClassLoader@299a06ac Classloader of LinkedList: null
この出力から、アプリケーションのクラスはAppClassLoader、SQLPermissionなどのプラットフォーム関連クラスはPlatformClassLoader、そしてLinkedListのようなコアモジュールのクラスはnull(ブートストラップクラスローダー)によってロードされていることが確認できます。
-
Java 9における@Deprecatedアノテーションの改善点とは?新要素「since」「forRemoval」を徹底解説
@Deprecatedアノテーションとはクラス、メソッド、フィールドなど、プログラム内のあらゆる要素に付与できる@Deprecatedアノテーションは、「その要素はもはや使用すべきではない」ことを示すためのものです。要素が非推奨とされる主な理由は以下の通りです。使用すると危険であり、エラーを引き起こす可能性がある将来のバージョンで互換性がなくなる可能性がある将来のバージョンで削除される可能性があるより優れた、効率的な代替手段がすでに提供されているJava 9で追加された2つの新しい要素Java 9では、@DeprecatedアノテーションにsinceとforRemovalという2つの新しい属性
-
JavaにおけるCursorクラスの役割とは?マウスカーソル制御の基本を解説
JavaのCursorクラスとはCursorクラスは、Objectクラスのサブクラスであり、画面上のポイント(指し示す位置)やインジケーター(表示標識)として定義されます。ユーザーがマウスを使ってシステムへの入力を選択・操作する際に、その位置を視覚的に示す重要な役割を担っています。GUIアプリケーションでは、状況に応じてカーソルの形状を変えることで、ユーザーに対して直感的なフィードバックを提供できます。例えば、処理中であることを伝える砂時計型のカーソルや、クリック可能な要素を示す手型のカーソルなどが代表的な例です。利用可能なカーソルの種類Cursorクラスには、あらかじめ定義されたさまざまなカ