クラスローダ
説明
クラスは必ず以下のいずれかのクラスローダに保持されています(厳密にはちょっと違いますが)。
保持するとは、クラスローダがメモリ上にクラス定義を持っているということです。
※以下はweblogicの例です。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (05.png)
各クラスは、属しているクラスローダの親クラスローダに対してしか検索要求を出せません。
つまり、参照しているクラスが子クラスローダに保持されている場合や
.classが見つからない場合、例外が発生します。
上の例で言うと、BarクラスのメンバとしてFooクラスは保持できますが、AservletクラスやBservletクラスは、
保持できないということです。
以下は各クラスローダがどこを検索するのかを示したものです。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (04.png)
クラスローダの検索は以下のような手順で実行されます。
-
ウェブクラスローダが自分が保持しているクラスをチェック。なければアプリクラスローダへ委譲
+アプリクラスローダが自分が保持しているクラスをチェック。なければシステムクラスローダへ委譲
+システムクラスローダがCLASSPATHを検索。なければアプリクラスローダへ委譲
+アプリクラスローダがAPP-INFを検索。なければウェブクラスローダへ委譲
+ウェブクラスローダがWEB-INFを検索。なければ例外
**クラスローダに伴う例外 [#ub1ea6ac]
-
NoClassDefFoundError
メソッド呼び出やnewなどのインスタンス生成で、クラス定義が見からない場合にスローされる。
コンパイル時にソースはあったが、いざ実行使用としたら、.classファイルがない場合などに発生する。
-
ClassNotFoundException
Class.foNameなどでクラスの文字列名を使用してクラス定義をロードしようとしたが、
クラス定義が見つからなかった場合にスローされる。
Class クラスの forName メソッドClassLoader クラスの findSystemClass メソッド ClassLoader クラスの loadClass メソッド
まとめ
- メモリ上にクラス定義がない場合親クラスローダに委譲する
- 子クラスローダには委譲できない
- 基本的に一番トップの親から順にクラスロードされると考えてよい
- newしたときにクラスがみつからなかったらNoClassDefFoundError
- Class.ForNameでクラスが見つからなかったらClassNotFoundException
参考
http://www.techscore.com/tech/J2EE/Servlet/supplement-1.html