ブログトップ 記事一覧 ログイン 無料ブログ開設

wyukawa’s blog

2008-02-03

クラスローダ

no titleを読んでわかった気になって、

後日またわからなくなって、また読み返してしまう。そんなクラスローダ。^^);

ちなみに、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 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の方がSeasarのJTA、コネクションプーリング部分の実装のシンプルさに感心した記事もありました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/wyukawa/20080203/1202028660