ページの先頭行へ戻る
Interstage Application Server Java EE運用ガイド(Java EE 6編)
Interstage

3.14 クラスローダ

Javaのクラスローダはクラスファイルを検索し、クラスをメモリにロードする機能を提供します。
Java EEアプリケーションを作成する際は、クラスがどのクラスローダでロードされるかを理解してJava EEアプリケーションを構築してください。

クラスローダの階層

Javaのクラスローダは、親クラスローダと子クラスローダからなる階層構造を持っています。親クラスローダと子クラスローダの関係は、オブジェクトのスーパークラスとサブクラスの関係に似ています。
子クラスローダでロードされたクラスから親クラスローダでロードされたクラスを参照することはできますが、親クラスローダでロードされたクラスから子クラスローダでロードされたクラスを参照することはできません。



JNI(Java Native Interface)を利用している場合はさらに注意が必要です。JNIを利用する場合は、Nativeモジュールをクラスローダがロードしますが、Javaのクラスローダでは同じNativeモジュールは同じクラスローダ上からだけ利用可能となります。



(1)と(2)で同じNativeモジュールを使用していますが、先にNativeモジュールを読み込んだ側からだけ利用可能となります。
クラスBが先に動作した場合はクラスAには「java.lang.UnsatisfiedLinkError」がスローされます。
上記は、本製品の場合にも当てはまります。

クラスのロード

クラスローダは、委譲モデルを使ってクラスをロードします。クラスローダは関連する親クラスローダを持ち、クラスをロードするために呼び出されると、クラスローダはそれ自体でクラスのロードを試みる前に、該当クラスのロードを親クラスローダに委譲します。