2

実行時にクラスを Java にリロードする方法を探しています。動機は、デバッグをより効率的にすることです。アプリケーションは、要求を同期的に処理する典型的なクライアント/サーバー設計です。「ハンドラ」オブジェクトは、リクエストごとにインスタンス化されます。これは、動的に置き換える予定の唯一のクラスです。各リクエストは新しいインスタンスを処理するため、このクラスをリロードしても副作用はありません。要するに、このモジュールに変更があるたびにアプリケーション全体を再起動したくありません。

私の設計では、Java プロセスは、要求の間にクラスパスで .class ファイルが更新されたことを認識します。これが発生すると、「ハンドラ」クラスがアンロードされ、新しいクラスがロードされます。

classLoader インターフェースを使用して新しいクラスをロードできることはわかっています。「アンロード」の適切な方法を見つけるのに苦労しているようです。

4

3 に答える 3

4

クラスへの参照が残っていない場合、クラスは他のオブジェクトと同様にアンロードされ、ガベージコレクションされます。つまり、クラスの到達可能なインスタンス(その特定のクラスローダーインスタンスによってロードされる)が存在してはならず、クラスローダーインスタンス自体もガベージコレクションの対象である必要があります。

したがって、基本的には、新しいクラスローダーインスタンスを作成して新しいバージョンのクラスをロードし、古いバージョンのインスタンスへの参照が残っていないことを確認するだけです。

于 2010-11-16T13:41:00.493 に答える
1

実際にはクラスローダーの階層が必要であり、リロードするためには、実際に低レベルのクラスローダーを(通常のGC手段で)削除するため、ロードされたすべてのクラスが削除されます。私が知る限り、この手法は Java EE アプリ サーバーでアプリケーションのリロードに使用されており、あるクラスローダーにロードされたフレームワーク コードが別の場所にロードされたクラスを使用したい場合、さまざまな面白い結果が得られます。

于 2010-11-16T13:43:52.827 に答える