2013-11-28 19 views
9

私は、Javaで異なるクラスローダーがあり、1つは基本クラスローダーであり、カスタムクラスローダーもあることを読んでいるので、なぜ基本クラスローダーがJavaのすべてのクラスを提供することができませんか? 他のクラスローダーが必要なのはなぜですか?Javaで異なるクラスローダーが必要な理由

+1

ファーストクラスローダーのクラスパスを小さくする利点の1つは、クラスをより迅速に見つけることができるということです。 –

+0

[Java ClassLoaderとは何ですか?](http://stackoverflow.com/questions/2424604/what-is-a-java-classloader) – Kayaman

+1

これが閉じられる前に誰かが良い簡単な答えを書いてくれることを願っています... – vikingsteve

答えて

11

主な必要性は分離です。

ページに3つのアプレットがあり、それぞれが異なるバージョンのライブラリfoo.jarを使用しているとします。それらのアプレットのそれぞれが独自のバージョンのライブラリで動作し、別のアプレットのつま先を歩かないようにします。これは、異なるクラスローダーのおかげで実現します。

単一のコンテナに配備されたWebアプリケーションでも同じことが言えます。 Javaコンテナは、アプリがデプロイされていない状態で起動され、アプリがデプロイされます。コンテナが開始されたときに知らなかった場所からクラスをロードできるようにします。また、別のWebアプリケーションがデプロイされている場合、この他のアプリに独自のクラスとライブラリを持たせてください。これは、最初のアプリのクラスとライブラリとは異なります。

また、ファイルシステムだけでなく、URL、データベースなど、様々な場所からクラスをロードすることもできます。

+0

ほぼ完璧な答えIMO。異なるクラスローダーを利用することで、同じJVM内に存在する同じクラスの複数のコピー(ただし、異なるアプリケーションで使用される異なるバージョンなど)など、クラスパスの衝突も解決されるという点で、分離の必要性を広げたい例:Hibernate 3.xを使用するアプリケーションとHibernate 4.xを使用するアプリケーション)。 – Gimby

5

あなたはシステムクラスローダーが提供するもの以外の機能を先に多くの実用的な状況があります。

  1. あなたは
  2. あなたはブロックをキャッシュすることができます(http経由で、例えば)カスタムクラス・ソースへのアクセスを与えることができます
  3. 特定のクラスのロードを妨げるセキュリティプロトコルを組み込むことができます。
  4. 使用されているクラスの統計情報を保持することができます。たとえば、 jarアーカイブを後で最適化する
  5. クラスの読み込み中にバイトコード変換(「ロード時ウィービング」)を実行して、特定のパターンに適合するクラスを変更することができます。アスペクト指向プログラミングの実装では、この手法を使用できます。

最後の点は特に強力です(私がそれらを使用した主な理由です)。 Javaバイトコードはプラットフォーム間で共通であるため、どのメソッドを呼び出すかを測定したり、セキュリティクリティカルな呼び出しを抑制したり、独自のカスタムログルーチンにSystem.outアクセスを誘導したり、高度な動的バグテストを実行したりルーチン。

+0

後者のポイントは通常、Javaエージェントとそれらによって提供されるInstrumentationインタフェースを使用して行われます。特定のクラスローダーの実装は、通常、これには使用されません。しかし、良い答え、まだ私から+1。 – Matthias

0

アプリケーションサーバーを開発しているとします。要件に基づいて、サーバーの起動時にクラスをロードすることができます。原始ローダーはあなたの必要条件を認識していません&したがって、独自のクラスローダーを書く必要があります。

why write custom class loader

0

あなたも、あなたができれば、すべてのクラスで同じクラスローダを使用したくない場合があります理由answerは非常によくまとめ:

クラスローダを行うには大規模なシステムやサーバーアプリケーションで使用されています以下のようなもの:

  • はアンロードおよび更新モジュール実行時に、システムと負荷をモジュール
  • 異なるバージョンのAPIライブラリを使用します(例:
  • が同じJVM内で実行している異なるアプリケーションを分離並列にXMLパーサ)(
3

つ)は、例えば、静的変数を介して、互いに干渉しない確保する理由は、セキュリティです。たとえば、デフォルト(パッケージ/プライベート)の可視性レベルでは、同じパッケージのクラス()にのみアクセスでき、同じクラスローダーによってロードされます。これにより、悪質なコードが内部APIにアクセスすることがより困難になります。

参考文献:クラスローダーの

0

タイプ:

  1. ブートストラップクラスローダ/ Premodialクラスローダ
  2. 拡張クラスロアDER
  3. アプリケーションクラスローダ/システムクラスローダ

ブートストラップクラスローダ:コアJAVA APIのクラスは、rt.jarのrt.jarのの

場所に存在するクラス、すなわちロードする責任 - > jdk/jre/lib/rt.jar ブートストラップクラスパスとも呼ばれます。

ブートストラップクラスローダーは、ブートストラップクラスパスからクラスをロードします。ブートストラップはCやC++のようなネイティブ言語で実装され、JAVAでは実装されていません。

拡張クラスローダー

:拡張クラスパスからロードクラスは、すなわちJDK/JRE/libに/ EXT/* jarファイル

拡張クラスローダはBootStrapClassLoaderの子であり、それはJavaで実装されています。拡張クラスローダの子クラス:

対応するJavaクラスはsun.misc.Launcher$ExtClassLoader.class

アプリケーションクラスローダです。アプリケーションクラスローダは、アプリケーションクラスパスからクラスをロードします。内部的に環境クラスパスを使用します。

JAVAで実装されています。対応するJAVAクラスはsun.miscLauncher$AppClassLoader.class

です。クラスローダーは、委任階層原則です。 JVMが特定のクラスに遭遇するたびに、まず.classファイルが既にロードされているかどうかをチェックします。すでにメソッド領域にロードされている場合は、JVMはロードされたクラスを考慮します(特定のクラスをロードするには、クラスローダーサブシステム)。クラスローダーサブシステムがアプリケーションクラスローダーに要求を渡すと、要求をExtensionクラスローダーに委譲し、それをBootStrapに委譲します。クラスローダーは、ブートストラップクラスパスを検索します。見つからない場合、エクステンションクラスローダー検索拡張クラスパスlaodeはアプリケーションクラスパスを検索しますが、クラスが見つからない場合はClassNotFoundExceptionまたはNoClassDefFoundErrorが発生します。

関連する問題