検索

3.6. デプロイメントでのプログラムを用いたクラスローダーの使用

download PDF

3.6.1. デプロイメントでのプログラムによるクラスおよびリソースのロード

プログラムを用いて、アプリケーションコードでクラスやリソースを検索またはロードできます。選択する方法は、いくつかの要因によって異なります。本トピックでは、使用できる方法を説明し、それらの方法を使用するガイドラインを提供します。
Class.forName() メソッドを使用したクラスのロード
Class.forName()メソッドを使用すると、プログラムでクラスをロードして初期化することができます。このメソッドには 2 つのシグネチャーがあります。
Class.forName(String className)
このシグネチャーは、1 つのパラメーター (ロードする必要があるクラスの名前) のみを取ります。このメソッドシグネチャーを使用すると、現在のクラスのクラスローダーによってクラスがロードされ、デフォルトで新たにロードされたクラスが初期化されます。
Class.forName(String className, boolean initialize, ClassLoader loader)
このシグネチャーは、クラス名、クラスを初期化するかどうかを指定するブール値、およびクラスをロードする ClassLoader の 3 つのパラメーターを想定します。
プログラムでクラスをロードする場合は、3 つの引数のシグネチャーを用いる方法が推奨されます。このシグネチャーを使用すると、ロード時に目的のクラスを初期化するかどうかを制御できます。また、JVM はコールスタックをチェックして、使用するクラスローダーを判断する必要がないため、クラスローダーの取得および提供がより効率的になります。コードを含むクラスがCurrentClassという名前だとすると、CurrentClass.class.getClassLoader()メソッドを使ってそのクラスのクラスローダーを取得することができます。
次の例は、TargetClass クラスをロードして初期化するためのクラスローダーを提供します。

例3.7 TargetClass をロードして初期化するためのクラスローダーを提供します。

Class<?> targetClass = Class.forName("com.myorg.util.TargetClass", true, CurrentClass.class.getClassLoader());
名前ですべてのリソースを検索
リソースの名前とパスが分かり、直接そのリソースをロードする場合は、標準的な Java development kit の Class または ClassLoader API を使用するのが最良の方法です。
単一のリソースをロードします。
自分のクラスまたはデプロイメント内の別のクラスと同じディレクトリーにある単一のリソースをロードするには、Class.getResourceAsStream()メソッドを使用します。

例3.8 デプロイメントに単一のリソースをロードします。

InputStream inputStream = CurrentClass.class.getResourceAsStream("targetResourceName");
単一リソースのインスタンスをすべてロードします。
デプロイメントのクラスローダーが認識できる単一リソースのすべてのインスタンスをロードするには、Class.getClassLoader().getResources(String resourceName) メソッドを使用します。ここで、resourceName はリソースの完全修飾パスに置き換えます。このメソッドは、指定の名前でクラスローダーがアクセスできるリソースに対し、すべての URL オブジェクトの列挙を返します。その後、URL の配列で繰り返し処理し、 openStream() メソッドを使用して各ストリームを開くことができます。

例3.9 リソースのすべてのインスタンスをロードし、結果を繰り返し処理します。

Enumeration<URL> urls = CurrentClass.class.getClassLoader().getResources("full/path/to/resource");
while (urls.hasMoreElements()) {
    URL url = urls.nextElement();
    InputStream inputStream = null;
    try {
        inputStream = url.openStream();
        // Process the inputStream
        ...
    } catch(IOException ioException) {
        // Handle the error
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (Exception e) {
                // ignore
            }
        }
    }
}
注記
URL インスタンスはローカルストレージからロードされるため、openConnection() や他の関連するメソッドを使用する必要はありません。ストリームは非常に簡単に使用でき、ストリームを使用することにより、コードの複雑さが最小限に抑えられます。
クラスローダーからクラスファイルをロードします。
クラスがすでにロードされている場合は、以下の構文を使用して、そのクラスに対応するクラスファイルをロードできます。

例3.10 ロードされたクラスのクラスファイルをロードします。

InputStream inputStream = CurrentClass.class.getResourceAsStream(TargetClass.class.getSimpleName() + ".class");
クラスがロードされていない場合は、クラスローダーを使用し、パスを変換する必要があります。

例3.11 ロードされていないクラスのクラスファイルをロードします。

String className = "com.myorg.util.TargetClass"
InputStream inputStream = CurrentClass.class.getClassLoader().getResourceAsStream(className.replace('.', '/') + ".class");
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.