3

難しい質問があります。

私のJavaプログラムはループで次のようなことをしています:

ループ:

  1. コンパイルされた Java クラスを含む外部ファイルを byte[] 配列に読み込みます。

  2. 自分のクラスローダーの新しいインスタンスを作成します。

  3. 読み込まれたファイルからクラスローダーのこのインスタンスへの setbytes。

  4. 作成されたクラスローダーを使用して、外部ファイルからクラスのオブジェクトの新しいインスタンスを作成します。

  5. 作成されたオブジェクトの任意のメソッドを呼び出します。

そして、問題はどこにありますか。

  1. このプログラムをデバッグモードで実行すると、期待どおりに動作するため、外部ファイルが変更された場合、クラスローダーは新しいバージョンのクラスをロードして新しいバージョンを実行します (ファイルが変更されていない場合は、もちろん古いバージョンもロードします)。

  2. しかし、このプログラムをデバッグモードで実行しないと、読み取ったファイルが変更されているにもかかわらず、常に古いバージョンが実行されます。

クラスローディングの問題と JVM の動作についてより深い知識を持っている人が、この動作を説明してくれるかもしれません。

4

2 に答える 2

1

何が起こるかの単純化されたバージョンは次のとおりです。

  1. JVM は、クラスおよびその他のリソースを、CLASSPATH 環境変数で指定されたディレクトリまたは Jar からクラスパスに 1 回だけロードします (デバッグ モードで実行されている場合を除く)。
  2. これを行うには、ClassLoaders を使用します。
  3. リソースが ClassLoader インスタンスによってロードされると、ClassLoader がガベージ コレクションされるまでメモリ内に残ります。

デバッグ モードは、JVM によって提供される特別なモードであり、クラスローダは、リソースの最新バージョンを提供するために一生懸命働きます。

于 2012-05-14T10:50:45.370 に答える
0

同じクラスローダーで同じクラスをリロードすることはできません

動的クラスの再読み込み/読み込みに関するよく書かれた記事を見つけることができますここ

于 2012-05-14T10:19:27.413 に答える