私は、Javaで異なるクラスローダーがあり、1つは基本クラスローダーであり、カスタムクラスローダーもあることを読んでいるので、なぜ基本クラスローダーがJavaのすべてのクラスを提供することができませんか? 他のクラスローダーが必要なのはなぜですか?Javaで異なるクラスローダーが必要な理由
答えて
主な必要性は分離です。
ページに3つのアプレットがあり、それぞれが異なるバージョンのライブラリfoo.jarを使用しているとします。それらのアプレットのそれぞれが独自のバージョンのライブラリで動作し、別のアプレットのつま先を歩かないようにします。これは、異なるクラスローダーのおかげで実現します。
単一のコンテナに配備されたWebアプリケーションでも同じことが言えます。 Javaコンテナは、アプリがデプロイされていない状態で起動され、アプリがデプロイされます。コンテナが開始されたときに知らなかった場所からクラスをロードできるようにします。また、別のWebアプリケーションがデプロイされている場合、この他のアプリに独自のクラスとライブラリを持たせてください。これは、最初のアプリのクラスとライブラリとは異なります。
また、ファイルシステムだけでなく、URL、データベースなど、様々な場所からクラスをロードすることもできます。
ほぼ完璧な答えIMO。異なるクラスローダーを利用することで、同じJVM内に存在する同じクラスの複数のコピー(ただし、異なるアプリケーションで使用される異なるバージョンなど)など、クラスパスの衝突も解決されるという点で、分離の必要性を広げたい例:Hibernate 3.xを使用するアプリケーションとHibernate 4.xを使用するアプリケーション)。 – Gimby
あなたはシステムクラスローダーが提供するもの以外の機能を先に多くの実用的な状況があります。
- あなたは
- あなたはブロックをキャッシュすることができます(http経由で、例えば)カスタムクラス・ソースへのアクセスを与えることができます
- 特定のクラスのロードを妨げるセキュリティプロトコルを組み込むことができます。
- 使用されているクラスの統計情報を保持することができます。たとえば、 jarアーカイブを後で最適化する
- クラスの読み込み中にバイトコード変換(「ロード時ウィービング」)を実行して、特定のパターンに適合するクラスを変更することができます。アスペクト指向プログラミングの実装では、この手法を使用できます。
最後の点は特に強力です(私がそれらを使用した主な理由です)。 Javaバイトコードはプラットフォーム間で共通であるため、どのメソッドを呼び出すかを測定したり、セキュリティクリティカルな呼び出しを抑制したり、独自のカスタムログルーチンにSystem.outアクセスを誘導したり、高度な動的バグテストを実行したりルーチン。
後者のポイントは通常、Javaエージェントとそれらによって提供されるInstrumentationインタフェースを使用して行われます。特定のクラスローダーの実装は、通常、これには使用されません。しかし、良い答え、まだ私から+1。 – Matthias
アプリケーションサーバーを開発しているとします。要件に基づいて、サーバーの起動時にクラスをロードすることができます。原始ローダーはあなたの必要条件を認識していません&したがって、独自のクラスローダーを書く必要があります。
あなたも、あなたができれば、すべてのクラスで同じクラスローダを使用したくない場合があります理由answerは非常によくまとめ:
クラスローダを行うには大規模なシステムやサーバーアプリケーションで使用されています以下のようなもの:
- はアンロードおよび更新モジュール実行時に、システムと負荷をモジュール
- 異なるバージョンのAPIライブラリを使用します(例:
- が同じJVM内で実行している異なるアプリケーションを分離並列にXMLパーサ)(
つ)は、例えば、静的変数を介して、互いに干渉しない確保する理由は、セキュリティです。たとえば、デフォルト(パッケージ/プライベート)の可視性レベルでは、同じパッケージのクラス()にのみアクセスでき、同じクラスローダーによってロードされます。これにより、悪質なコードが内部APIにアクセスすることがより困難になります。
参考文献:クラスローダーの
タイプ:
- ブートストラップクラスローダ/ Premodialクラスローダ
- 拡張クラスロアDER
- アプリケーションクラスローダ/システムクラスローダ
ブートストラップクラスローダ:コア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が発生します。
- 1. TextWatcherが必要な理由
- 2. RIAが必要な理由
- 3. "rec"が必要な理由
- 4. Javaシステムのみのクラスローダーが必要
- 5. メテオでパッケージインポートが必要な理由
- 6. WPFでAutomationPropertiesが必要な理由
- 7. I2Cでクロックストレッチが必要な理由
- 8. Java EEアプリケーションサーバーで単一のJVMインスタンスが必要な理由
- 9. Javaで空のクラスが必要な理由
- 10. return文が必要な理由を理解できない
- 11. random.choiceのリストが必要な理由
- 12. HerokuにResque 1.22.0が必要な理由
- 13. AMQPにmessageIdが必要な理由
- 14. カスタムディレクティブにBindToControllerが必要な理由
- 15. RVMにYAMLが必要な理由
- 16. rvmにログインシェルが必要な理由
- 17. Google Analytics UTMが必要な理由
- 18. ECUキャリブレーションが必要な理由
- 19. JDBC-ODBCにドライバが必要な理由
- 20. Dockerにユニオンファイルシステムが必要な理由
- 21. 識別子が必要な理由
- 22. refrehアクセストークンのリフレッシュトークンが必要な理由
- 23. mongodb getSisterDBが必要な理由
- 24. ハードリンクとソフトリンクが必要な理由
- 25. Javaサーブレット内で実行されるシェルスクリプトファイルでスリープが必要な理由
- 26. MySQLがJava floatと異なる理由は何ですか?
- 27. Javaのループ値でSSLのパフォーマンスが異なる理由
- 28. Javaセキュアなコーディングが重要な理由は何ですか?
- 29. Javaでは、例外クラスが必要になる前にクラスローダーが使用できるようにする必要があるのはなぜですか?
- 30. 仮想マシンが必要な理由Javaプログラムを実行する必要があります。
ファーストクラスローダーのクラスパスを小さくする利点の1つは、クラスをより迅速に見つけることができるということです。 –
[Java ClassLoaderとは何ですか?](http://stackoverflow.com/questions/2424604/what-is-a-java-classloader) – Kayaman
これが閉じられる前に誰かが良い簡単な答えを書いてくれることを願っています... – vikingsteve