Java
 Computer >> コンピューター >  >> プログラミング >> Java

【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" など)を取得します。

実行結果

実行すると、各モジュール名と、それをロードしたクラスローダー(appplatformbootstrap)の一覧が出力されます。出力内容は、使用している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群がプラットフォームクラスローダー、開発者ツール系モジュールがアプリケーションクラスローダーによってロードされていることが読み取れます。モジュールシステムの理解を深めるうえで、非常に有用なテクニックといえるでしょう。

  1. 【Java】JLabelのテキストに異なる色とフォントを適用する方法を解説

    Java SwingでGUIアプリケーションを開発する際、JLabelのテキストを1つのラベル内で複数の色やフォントサイズに分けて表示したいケースはよくあります。実は、JLabelはHTMLタグをサポートしているため、<font>タグを活用することで簡単に実現できます。本記事では、その具体的な方法をサンプルコード付きで解説します。 JLabelクラスとは JLabelクラスはJComponentクラスを継承しており、GUI上にテキストによる説明や情報を表示するために使用されます。 JLabelは、読み取り専用(read-only)の1行テキスト、画像、またはテキストと画像の両方を

  2. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー