【Java 9】クラスローダーを使ってすべてのモジュールを一覧表示する方法
Java 9におけるクラスローダーの変化
Java 9より前のバージョンでは、拡張(extension)クラスローダーとアプリケーション(application)クラスローダーは、どちらも java.net.URLClassLoader クラスのインスタンスでした。しかしJava 9では、クラスローダーの分類が見直され、従来の拡張クラスローダーに代わってプラットフォームクラスローダー(Platform Class Loader)が新たに導入されました。
プラットフォームクラスローダーが導入された主な目的は、ブートストラップクラスローダーによってロードされるクラスが、デフォルトですべての権限(パーミッション)を持つ状態を保つためです。これにより、モジュールシステム(JPMS)との整合性が向上し、セキュリティモデルも明確になりました。
サンプルコード:クラスローダーごとにすべてのモジュールを表示する
次の例では、ModuleLayer.boot() を使って起動時のモジュールレイヤーを取得し、各モジュールがどのクラスローダーによってロードされているかを出力しています。モジュールのクラスローダーが null の場合は、ブートストラップクラスローダーによってロードされたことを意味します。
import static java.util.Objects.isNull;
public class Java9ClassLoaderTest {
public static void main(String args[]) {
ModuleLayer layer = ModuleLayer.boot();
layer.modules().forEach(module -> {
ClassLoader classLoader = module.getClassLoader();
String classLoaderName = isNull(classLoader) ? "bootstrap" : classLoader.getName();
System.out.println(classLoaderName + ": " + module.getName());
});
}
}
コードのポイント
- ModuleLayer.boot():起動時(ブート)モジュールレイヤーを取得します。
- layer.modules():そのレイヤーに含まれるすべてのモジュールを返します。
- module.getClassLoader():モジュールを定義しているクラスローダーを取得します。
nullの場合はブートストラップクラスローダーです。 - classLoader.getName():クラスローダーの名前("app"、"platform" など)を取得します。
実行結果
実行すると、各モジュール名と、それをロードしたクラスローダー(app / platform / bootstrap)の一覧が出力されます。出力内容は、使用しているJDKのバージョンや環境によって異なる点に注意してください。
app: jdk.internal.ed platform: jdk.scripting.nashorn platform: java.compiler platform: java.security.jgss bootstrap: jdk.net bootstrap: java.management app: jdk.jdeps platform: javafx.base bootstrap: java.security.sasl platform: java.sql.rowset app: jdk.compiler platform: java.scripting bootstrap: java.xml platform: jdk.localedata bootstrap: jdk.unsupported bootstrap: java.rmi platform: java.sql app: jdk.attach platform: java.xml.crypto bootstrap: jdk.jfr bootstrap: java.base bootstrap: java.prefs platform: jdk.zipfs app: jdk.jlink bootstrap: java.logging app: jdk.jdi platform: java.se app: jdk.javadoc platform: jdk.charsets app: jdk.jconsole platform: javafx.graphics bootstrap: java.naming app: jdk.jshell bootstrap: java.desktop platform: javafx.fxml bootstrap: java.instrument platform: jdk.crypto.ec bootstrap: jdk.management platform: jdk.xml.dom ...(以下省略)
まとめ
Java 9以降は、ModuleLayer API を利用することで、モジュールとクラスローダーの対応関係を簡単に確認できます。出力結果から、java.base などのコアモジュールがブートストラップクラスローダー、JDKの標準API群がプラットフォームクラスローダー、開発者ツール系モジュールがアプリケーションクラスローダーによってロードされていることが読み取れます。モジュールシステムの理解を深めるうえで、非常に有用なテクニックといえるでしょう。
-
【Java】JLabelのテキストに異なる色とフォントを適用する方法を解説
Java SwingでGUIアプリケーションを開発する際、JLabelのテキストを1つのラベル内で複数の色やフォントサイズに分けて表示したいケースはよくあります。実は、JLabelはHTMLタグをサポートしているため、<font>タグを活用することで簡単に実現できます。本記事では、その具体的な方法をサンプルコード付きで解説します。 JLabelクラスとは JLabelクラスはJComponentクラスを継承しており、GUI上にテキストによる説明や情報を表示するために使用されます。 JLabelは、読み取り専用(read-only)の1行テキスト、画像、またはテキストと画像の両方を
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー