ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server J2EE ユーザーズガイド

2.3 クラスローダ

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


クラスローダの階層

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



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



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


クラスのロード

一般的には、クラスローダは委譲モデルを使ってクラスをロードします。クラスローダは関連する親クラスローダを持ち、クラスをロードするために呼び出されると、クラスローダはそれ自体でクラスのロードを試みる前に、該当クラスのロードを親クラスローダに委譲します。
Interstageが利用するクラスとアプリケーションが利用するクラスの独立性を高めるために、Interstageのクラスローダはこの委譲モデルとは少し違う動作をします。Interstageのクラスローダの検索順番については以降で説明します。