hiranojavaのクラスローダの仕組みについてTwitterFacebookGoogle+はてブPocketjavaのクラスローダに関して下記のようなコードが存在するときの内部動作がよくわからなかったので調べ所を残すことにしてみました。いうメソッドは何なのか、ということですが文字通りクラスローダを取得することができます。C.class.getClassLoader();先に答えを言ってしまうと、この2つで返却されるクラスローダは同じものになります。呼び出すとクラスは自分の参照するクラスローダを返却します。すべてのクラスは必ず一つのクラスローダへの参照を持っており、それは自クラスをロードしたときに使用されたクラスローダを参照するようになっています。同プロジェクトのアプリケーションとして実装されているので、この2つは同じクラスローダによってロードされるため上記のような場合は大抵は同じクラスローダが返却されます。クラスローダによるクラスの解決についてまたクラスローダは自分の解決するクラスの領域というものが決まっており、階層構造を持ちます。これはDNSで各ネームサーバが自分のゾーンだけを管理して、解決できない場合は親ネームサーバへと処理を移譲する仕組みと同じようなものです。javaのデフォルトパッケージを解決するクラスローダのことを「ブートストラップクラスローダ」と呼び、これは一番親のクラスローダとして位置します。その下にアプリケーションのクラスを解決するための「システムクラスローダ」というクラスローダが存在します。そんなに複雑でないシステムの場合はこの「システムクラスローダ」がアプリケーションクラスのクラスローダとして機能すると考えていて問題ないと思います。クラスローダはクラスロードの依頼を受けた際にはまず親のクラスローダに対して解決を移譲します。クラスが解決できないようであれば自分自身の管理する空間を探索します。下記のようなサンプルコードを用意して実行してみましょう。ちなみにこのコードはgroovyにて記述してあります。いうクラスが実態のようです。通常はこのシステムクラスローダがすべてのアプリケーションクラスのクラスローダとして機能します。異なるクラスローダが用いられるアプリケーションはあるのか主にJ2EEサーバなどにおいてはwarをおいただけで異なるアプリケーションをホストできる仕組みを提供しているため、各種ウェブアプリケーション単位でシステムクラスローダが異なるような形になると思われます。設置した複数のwarファイルの中で同じ名称のクラスが存在する際に、うまく解決できないようではアプリケーションとして致命的ですので、このような場合にうまく機能してくる仕組みだと思われます。通常はひとつのプロジェクトが固有の一つのクラスローダを持つ、、的な理解で問題ないと思います。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。daemonを無効にするRECOMMENDこちらの記事も人気です。