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