クラスローダ

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));

    }

有名みたいで、

ソースコードリーディングから学ぶ Javaの設計と実装

ソースコードリーディングから学ぶ Javaの設計と実装

Java World (ジャバ・ワールド) 2005年 9月号

Java World (ジャバ・ワールド) 2005年 9月号

*1
に出てたりします。

applicationClassメソッドはRequestProcessorからActionクラスをロードする際に呼ばれます。

で、単純にClass.forNameだとstruts-xx.jarがEARクラスローダで読み込まれた場合に、自作したActionクラスは
WARクラスローダのクラスパス上にあり、親から子がみれずClassNotFoundExceptionになるようです。

それを回避するためにStrutsは上記のようなことをやっているようです。

スレッドに関連付けられたコンテキストクラスローダ(HTTPリクエストにひもづいたWARクラスローダ)を取得できたら、
それを使い、取得できなかったら(どんな場合?)、Strutsをロードしたクラスローダを使うようです(これがEARクラスローダだったら、やっぱりActionクラスが見つからないような。。。)。

*1:この雑誌にはひがさんも記事書いてます。JUnitから学んだシンプルさを身に着けようと思いSeasarの初期バージョン(APサーバのほうかな?)を書いたようです。またIBMの方がSeasarJTA、コネクションプーリング部分の実装のシンプルさに感心した記事もありました。