6

GUI のボタンをクリックして Java アプリケーションを再起動する方法を研究しています。Web を検索したところ、main( new String[0]) に出会いました。これがアプリケーションを再起動する有効な方法であるかどうかを理解する必要があります。誰かがアドバイスしてくれませんか。

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) {

    main( new String[0]);
    }

編集これは良いでしょうか?

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) {
    classname.this.dispose();
    main( new String[0]);
    }
4

7 に答える 7

13

main空の文字列配列を使用して静的メソッドを呼び出します。これがより明確になるかどうかを確認してください:

String[] args = new String[0]; // Or String[] args = {};
main(args);

main確かに、メイン以外のメソッドからメソッドを呼び出すことは珍しいことです...そして、これは実際にはアプリケーションを「再起動」しません。それは、厄介な結果をもたらす可能性がある既存のハンドラー内からそれを呼び出します。私はそれをお勧めしません。

完全にクリーンなプロセスを開始する方法を考え出すことができれば、それははるかに信頼性の高い「再起動」になります。

于 2012-10-31T23:40:56.020 に答える
7

JVMを終了せずにアプリケーションを再起動することはできません.JVMにはオブジェクトやスレッドなどが割り当てられており、多くのハウスキーピングがなければ、これを簡単に破棄することはできません.

簡単な方法は、アプリケーションをスクリプトでラップし、特定の終了コードで終了した場合にスクリプトにアプリを再起動させることだと思います。そうすれば、呼び出しを介して JVM を完全に破棄できます。System.exit()スクリプトが特定の終了コードを検出した場合にのみアプリを再起動する場合は、終了するか、終了して再起動するかを選択できます。

たとえば、 JavaServiceWrapperをチェックしてください。これにより、特定の構成/パラメーターを使用して Java アプリケーションを開始し、再起動の動作を制御する機能が提供されます。アプリケーション内から再起動を呼び出す特定の API 呼び出しを提供することに注意してください。

于 2012-10-31T23:45:30.173 に答える
3

アプリケーションの最初の呼び出しがまだ実行されているため、これはアプリケーションを再起動する良い方法ではありません。そのように何度もアプリケーションを「再起動」すると、スタック オーバーフローが発生します。

アプリケーションを終了せずに再起動する必要がある場合 (これは異常です)、内にtry/catchブロックを設定しmain、ループを配置して、例外が発生したときにループを続行できます。確かに、これは例外を使用して「通常の」プログラム フローを制御するため、他の何よりも回避策です。

于 2012-10-31T23:41:21.983 に答える
1

これは、@Brian Agnew が既に上で提案した具体的な例です。

あなたのJavaコードでは、再起動の場合に備えて特定の出口で終了します

if(restart){

System.exit(5);

}else{
 System.exit(0);
}

次に、実際にアプリケーションを起動するために使用されるスクリプトを作成します。ここでは Windows バッチ スクリプトの例を示していますが、他の OS に対しても同様のスクリプトを実行できます。

バッチ ファイル:

@echo off

:start

java Test %1
set exitcode=%ERRORLEVEL%

if %exitcode% == "5" (goto :start)

ステータス コード 5 (任意の整数) で終了すると、プログラムがバッチで再起動されます (Testメイン メソッドを持つクラスの例です) 。

于 2012-11-01T07:34:06.547 に答える
1

あなたがそれを読むように。

private void bnNewsaleActionPerformed(java.awt.event.ActionEvent evt) {

    main( new String[0]);
    }

それがしているのはbnnewsaleActionPerformed、空の新しい文字列で main() を呼び出すことです。
これはアプリケーションを再起動しません。

再起動とは、停止して再度開始することを意味します。

一方、コードでは、現在のアプリケーション内でアプリケーションを再度開始します。
それを入れ子にするようなもので、たとえば、静的割り当てをリセットしないなどの厄介な影響があります。

于 2012-10-31T23:49:32.047 に答える
0

main()そのクラスで定義した関数です。
type の単一の引数を取りますstring[]

この行は、他の関数と同様にその関数を呼び出します。
空の文字列配列 ( new String[0])を渡します

関数はアプリケーションを開始するためmain()、これによりアプリケーションが「再起動」されます。

ただし、静的状態はリセットされません。

于 2012-10-31T23:40:43.790 に答える
0

java の main メソッドについて特別なことは何もないので、main を呼び出すことは他のメソッドを呼び出すことと変わりません。Java ランタイムが「main」という名前のメソッドを検索する前に、jvm 初期化のすべてのビットが発生します。

jvm を終了せずにアプリケーションを再起動する場合は、すべての静的状態を回避またはクリーンアップする必要があります。単純なケースでは、アプリケーションの有効期間を管理するクラスを作成し、再起動のためにその新しいインスタンスを作成するだけです。

class MyApplication{
    public void start(){}//setup all application state and run it
    public void shutdown(){}//close all Windows/Connections and Threads
}

些細な例では、これは醜い ThreadLocals/static 変数/終了時に削除とマークされたファイルを取得する必要があります。また、アプリケーション クラスの更新は、いくつかのクラスローダの策略によってのみ表示されます。

于 2012-11-01T12:31:07.270 に答える