クラスローダ
http://www-06.ibm.com/jp/software/websphere/developer/j2ee/strategy/を読んでわかった気になって、
後日またわからなくなって、また読み返してしまう。そんなクラスローダ。^^);
ちなみに、Strutsの以下のクラスローディングの仕方は
public static Class applicationClass(String className) throws ClassNotFoundException { // Look up the class loader to be used ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if (classLoader == null) { classLoader = RequestUtils.class.getClassLoader(); } // Attempt to load the specified class return (classLoader.loadClass(className)); }
有名みたいで、
- 作者: WINGSプロジェクト佐藤匡剛,山田祥寛
- 出版社/メーカー: 技術評論社
- 発売日: 2006/11/29
- メディア: 大型本
- 購入: 17人 クリック: 227回
- この商品を含むブログ (58件) を見る
Java World (ジャバ・ワールド) 2005年 9月号
- 出版社/メーカー: IDGジャパン
- 発売日: 2005/07/23
- メディア: 雑誌
- 購入: 2人 クリック: 75回
- この商品を含むブログ (7件) を見る
に出てたりします。
applicationClassメソッドはRequestProcessorからActionクラスをロードする際に呼ばれます。
で、単純にClass.forNameだとstruts-xx.jarがEARクラスローダで読み込まれた場合に、自作したActionクラスは
WARクラスローダのクラスパス上にあり、親から子がみれずClassNotFoundExceptionになるようです。
それを回避するためにStrutsは上記のようなことをやっているようです。
スレッドに関連付けられたコンテキストクラスローダ(HTTPリクエストにひもづいたWARクラスローダ)を取得できたら、
それを使い、取得できなかったら(どんな場合?)、Strutsをロードしたクラスローダを使うようです(これがEARクラスローダだったら、やっぱりActionクラスが見つからないような。。。)。