3

Java で、それ自体をロードする (またはより適切にリロードする) クラスローダーを作成することは可能ですか?

最初は、デフォルトのクラスローダーによってロードできます。コンパイルとロードのサイクルを介して実行されているときに、それ自体を変更できる Java のシステムを想像します。もしそうなら、ロシア人形ローダーから継承する多くのオブジェクトを作成して、それらのロジックを動的に更新することができます。

4

1 に答える 1

1

修飾名が別ので始まらないすべてのクラスのコードをリロードできますが、これはクラスをリロードしません。代わりに、同じ修飾名を持つが定義が異なる新しいクラスを作成します。java.ClassLoaderClassLoader

Java® 仮想マシン仕様、§5.3を参照してください。作成と読み込み

クラスローダーは、直接定義するか、別のクラスローダーに委譲することによってL作成できます。直接作成するC場合、 が を定義する、または同等に、の定義ローダーであると言います。 …<br> 実行時に、クラスまたはインターフェイスは、その名前だけではなく、そのバイナリ名 (§4.2.1) とその定義クラス ローダーのペアによって決定されます。LCL CLC

したがって、別のクラス・ローダー・インスタンスを使用して既存のクラスと同じ修飾名を持つクラスを定義すると、実際には新しいランタイム・クラスが作成されます。もちろん、そのクラスは拡張ClassLoaderされ、同じ修飾名を持つ新しいクラスを再度定義するために使用される可能性があります。

これらの新しいクラスのバイトコードが同一であるか、変更されたバージョンであるか、まったく無関係であるかは問題ではありません。

これは、モジュールのリロードをサポートするほとんどのフレームワークがどのように機能するかに近いものです。彼らは新しいクラスローダーを作成します (ただし、古いクラスの子ではありません)。これは、変更されていないクラスを含むモジュールのすべてのクラスを「リロード」します。技術的には、それぞれの間でリンクする必要がある新しい無関係なクラスの動物園を作成します他の。
その後、古いクラスはスコープ外に出なければならず、これには注意が必要です。クラスローダーは、そのクラスがすべて未使用の場合にのみ、ガベージコレクションを取得できます。1 つのクラスの 1 つのインスタンスが、そのクラス ローダーとその定義されたすべてのクラスのガベージ コレクションを妨げる可能性があります…</p>

于 2016-06-24T09:10:42.833 に答える