最近、Java カスタム クラス ローダー API に出くわしました。ここで 1 つの使用法を見つけました。kamranzafar のブログ です。私はクラス ローダーの概念に少し慣れていません。詳細に説明できる人はいますか?それが必要な、または使用する必要があるさまざまなシナリオは何ですか?
3 に答える
カスタム クラス ローダーは、複数のモジュール/アプリケーションで構成される大規模なアーキテクチャで役立ちます。カスタム クラス ローダーの利点は次のとおりです。
- モジュラー アーキテクチャを提供 モジュラー アーキテクチャを可能にする複数のクラス ローダーを定義できます。
- 競合の回避クラスのスコープをクラス ローダー内に明確に定義します。
- バージョン管理のサポート 同じ VM 内で異なるモジュールの異なるバージョンのクラスをサポートします。
- メモリ管理の改善未使用のモジュールを削除すると、そのモジュールが使用するクラスがアンロードされ、メモリがクリーンアップされます。
- どこからでもクラスをロード クラスは、データベース、ネットワークなど、どこからでもロードできます。また、オンザフライで定義することもできます。
- リソースまたはクラスを動的に追加する 上記のすべての機能により、クラスまたはリソースを動的に追加できます。
- 変更されたクラスのランタイム再ロード 変更 されたクラスを含む実際のクラス ローダーに子クラス ローダーを作成することにより、1 つまたは複数のクラス ランタイムを再ロードできます。
主な用途はアプリケーションサーバーで、2つのアプリケーションを実行でき、クラスの競合が発生しないようにします。つまり、アプリケーション1にアプリケーション2と同じ名前のクラスがある場合、カスタムクラスローダーを使用すると、アプリケーション1がそのクラスをロードし、アプリケーション2がそのクラスをロードします。
また、クラスがカスタムクラスローダーによってロードされる場合、そのクラスをJVMからアンロードすることができます。アプリケーションサーバーでも役立ちます。
もう1つの用途は、インストルメンテーションです。アスペクト指向プログラミングを実行する1つの方法、または永続APIを使用する場合です。カスタムクラスローダーを使用すると、実行中のアプリケーションに渡される前に、ロードされたクラスに動作を追加できます。
Java クラス・ローダーは、その名前が示すほとんどのことを行います。つまり、クラスを使用できるようにメモリーにロードします。
クラスは、クラスをロードした ClassLoader にもリンクされます。
したがって、カスタム クラス ローダーを使用すると、さまざまな興味深い可能性が開かれます。
- 同じクラスの複数のバージョンを異なるクラスローダーでロードする (たとえば、バージョン管理の競合を解決するため)
- 実行時にクラスを動的にロードおよびアンロードする
- 新しいクラスの生成 (たとえば、Clojure のような JVM 言語は、さまざまなクラスローディング トリックを使用して、実行時に Clojure 関数を表す新しいコンパイル済みクラスを生成します)
- 非標準ソースからのクラスのロード
通常の Java アプリケーションでは、通常、クラスローダーについて心配する必要はありません。ただし、他のコードをホストする必要があるフレームワークまたはプラットフォームを作成している場合、それらはより重要/関連性が高くなります。