2012-10-31 97 views
6

我正在研究一種通過單擊GUI上的按鈕重新啓動我的Java應用程序的方法。我搜索了網頁,並遇到主要(新的字符串[0])。我需要了解這是否是重新啓動我的應用程序的有效方法。有人可以提醒,謝謝。我可以使用main()來重新啓動我的應用程序嗎?

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]); 
    } 
+0

如果您的應用程序的GUI仍然存在,那麼應用程序已經在運行 –

回答

0

main()是你在類中定義的功能。
它需要一個類型爲string[]的參數。

這行代碼與其他函數一樣調用該函數。
它傳遞一個空字符串數組(new String[0]

由於您main()功能開始您的應用程序,這將「重新啓動」它。

但是,它不會重置任何靜態狀態。

13

它使用空字符串數組調用靜態main方法。看看這使得它更清楚:

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

必須承認,這是不尋常的呼籲來自非主要方法main方法......這不會真正「重啓」的應用程序。它將從您現有的處理程序內部調用它,這可能會帶來不好的後果。我不會推薦它。

如果你能找到一種方法來開始一個完全清潔的過程,那將是一個更可靠的「重新啓動」。

3

這不是重新啓動應用程序的好方法,因爲應用程序的初始調用仍然在運行。如果你「重新啓動」你的應用程序那麼多次,你會得到一個堆棧溢出。

如果您必須重新啓動不退出它(這是不尋常的),你可以設置一個try/catch塊你main裏面,把環周圍,並不斷循環的時候,你會得到一個異常應用程序。無可否認,這比其他任何方法都更具有解決方法,因爲它使用異常來控制「正常」程序流。

+0

請不要重新啓動應用程序。重新啓動應用程序的正確方法是使用程序的必需類路徑/選項執行新的Java命令。 – Vulcan

+0

這是一種難以重新啓動的方式。 –

+0

@Vulcan無可否認,這是一個最後的解決方案,接近黑客。我編輯了我的答案,以表明清楚。 – dasblinkenlight

7

如果不退出JVM,您將無法重新啓動應用程序 - JVM將分配對象,線程等,並且沒有很多內務管理,您不會輕易地將此垃圾郵件垃圾回收。

我認爲一個更簡單的方法是將您的應用程序包裝在腳本中,並讓腳本重新啓動您的應用程序,如果它退出時使用特定的退出代碼。通過這種方式,您可以通過System.exit()調用完全清除JVM,並且如果腳本只在您的應用程序看到特定退出代碼時重新啓動應用程序,則可以選擇退出或退出並重新啓動。

例如請查看JavaServiceWrapper。這提供了使用特定配置/參數啓動Java應用程序並控制restart行爲的功能。請注意,它在您的應用程序中提供了一個particular API call to invoke a restart

1

正如你讀到的那樣。

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

    main(new String[0]); 
    } 

它是做什麼的bnnewsaleActionPerformed它調用的main()與空新的字符串。
這不會重新啓動您的應用程序。

重新啓動意味着停止並重新開始。

而您的代碼將在ypur當前應用程序中再次啓動您的應用程序。
有點像嵌套它,它會有令人討厭的效果,例如:不重置任何靜態分配。

0

下面是@Brian Agnew上面已經提出的一個具體例子。

在你Java代碼,具有特定的退出退出在重啓的情況下

if(restart){ 

System.exit(5); 

}else{ 
System.exit(0); 
} 

現在創建其實際使用來啓動應用程序的腳本。我在這裏給出了Windows批處理腳本的例子,但是您可以爲其他操作系統使用類似的腳本。

批處理文件:

@echo off 

:start 

java Test %1 
set exitcode=%ERRORLEVEL% 

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

當您使用的5狀態碼出口(它可以是任何整數),那麼你批次將重新啓動該程序(Test是具有主要的示例類方法

0

java中沒有什麼特別的主要方法,所以調用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 /靜態變量/文件標記刪除退出必須得到照顧。對應用程序類的更新也只會在某些類加載器的情況下可見。

相關問題