実行時にjarファイルを読み込む方法 [重複]について
2023-09-24 22:03:59
質問
実行中に新しいコード(拡張)をロードする機能を持つjavaシステムを構築するよう依頼されました。 コードが実行されている間に jar ファイルを再ロードするにはどうすればよいですか? または、新しい jar をロードするにはどうすればよいですか?
明らかに、一定のアップタイムが重要であるため、(物事をあまり複雑にしないのであれば)既存のクラスを実行中に再ロードする能力を追加したいと思います。
私が気をつけるべきことは何でしょうか? (実行時にクラスを再ロードすることに関する質問と、新しいクラスを追加することに関する質問という、2つの異なる質問だと考えてください)。
どのように解決するのですか?
既存のクラスを既存のデータで再読み込みすると、事態が悪化する可能性が高いです。
新しいクラスローダーに新しいコードを比較的容易にロードすることができます。
ClassLoader loader = URLClassLoader.newInstance(
new URL[] { yourURL },
getClass().getClassLoader()
);
Class<?> clazz = Class.forName("mypackage.MyClass", true, loader);
Class<? extends Runnable> runClass = clazz.asSubclass(Runnable.class);
// Avoid Class.newInstance, for it is evil.
Constructor<? extends Runnable> ctor = runClass.getConstructor();
Runnable doRun = ctor.newInstance();
doRun.run();
使われなくなったクラスローダーはガベージコレクションされます(ThreadLocalやJDBCドライバの使用でよくあるような、メモリリークがない限り)。
java.beans
など)。
オブジェクトのデータを保持したいのであれば、Serialisationなどの永続化メカニズムや、あなたが慣れ親しんでいるものをお勧めします。
もちろん、デバッグシステムはより派手なことができますが、よりハチャメチャで信頼性が低いです。
クラスローダーに新しいクラスを追加することは可能です。例えば
URLClassLoader.addURL
. しかし、もしクラスがロードに失敗したら(例えば、あなたがそれを追加していないから)、そのクラスはそのクラスローダーのインスタンスでロードされることは決してありません。
関連
-
javaの非静的メソッドを静的に参照することができない
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
java 365*1000*60*60*24 計算問題
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] Mavenプロジェクトにローカルのjarファイルを追加する方法は?
-
[解決済み] RuntimeでJARファイルを動的に読み込むには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
が 'X-Frame-Options' を 'sameorigin' に設定したため、フレーム内に存在する。
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
API の戻り値を処理するために ResponseEntity を使用する
-
Junitのユニットテストエラー
-
JNIエンカウンターエラー:構造体またはユニオンではない何かでメンバー 'FindClass' のリクエスト
-
Java Runtime Environmentを継続するためのメモリが不足しています。
-
[解決済み] RuntimeでJARファイルを動的に読み込むには?
-
[解決済み] なぜClass.newInstance()は "悪 "なのか?