クラスローダーでクラスのバイトコード実装を何らかの方法でリロードすることは可能ですか? 実行時にクラスにメソッドを追加しようとしています。
1 に答える
いいえ、クラスローダーでクラスをリロードすることはできません。
できることは、クラスの最初のバージョンをロードするカスタム クラス ローダーを作成して使用することです。クラスを更新する場合は、最初のクラスのすべてのインスタンス、その Class<> オブジェクトのすべてのインスタンス、および最初のバージョンをロードしたクラス ローダーを破棄します。これは、JVM でクラスをアンロードする唯一の方法です。GC がこれらすべてのもの (クラスのインスタンス、Class<> オブジェクト、およびクラスをロードした ClassLoader のインスタンス) を収集したときにアンロードされます。
次に、新しいクラス ローダーをインスタンス化し、クラスをロードします。
これは、サーブレット コンテナ (Tomcat など) がアプリケーションを動的にロードおよびアンロードするために行うことと似ています。
メソッドを動的に追加しようとしているだけなら、私が以前に使用した同様の非常に興味深いアプローチがあります。クラス・ローダーに関連付けられた Java Compiler API を使用できます。クラスの「コード」をクラス ローダーに渡すと、Java コンパイラが呼び出され (必要に応じてメモリ内で: ディスクにファイルを書き込む必要はありません)、クラス ローダーを使用してコンパイルされたバイトコードが読み込まれます。いずれにしても、このようにロードされたクラスをアンロードしたい場合は、上で説明したとおり、クラス ローダーを破棄する必要があります。