2012-10-31 15 views
6

Sto cercando un modo per riavviare la mia applicazione java facendo clic su un pulsante sulla GUI. Ho cercato sul Web e mi sono imbattuto in main (new String [0]). Devo capire se questo è un modo valido per riavviare la mia applicazione. Qualcuno può consigliare grazie.Posso usare main() per riavviare la mia applicazione?

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

    main(new String[0]); 
    } 

Modifica Questo sarebbe meglio?

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

Se la GUI dell'app è ancora attiva, l'app è già in esecuzione –

risposta

0

main() è una funzione definita in tale classe.
Richiede un singolo argomento di tipo string[].

Questa riga chiama tale funzione, proprio come qualsiasi altra funzione.
passa una matrice stringa vuota (new String[0])

Dal momento che la vostra funzione main() inizia la vostra applicazione, questo sarà "riavviare" esso.

Tuttavia, non ripristinerà nessuno stato statico.

13

Chiama il metodo statico main con un array di stringhe vuoto. Vedere se questo lo rende più chiaro:

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

Certo è insolito per chiamare un metodo main dal metodo non-main ... e questo non sarà davvero "restart" l'applicazione. Lo chiamerà dall'interno del gestore esistente che potrebbe avere conseguenze sgradevoli. Non lo raccomanderei.

Se riesci a trovare un modo per avviare un processo completamente pulito, sarebbe un "riavvio" molto più affidabile.

3

Questo non è un buon modo per riavviare l'applicazione, perché il richiamo iniziale dell'applicazione sarebbe ancora in esecuzione. Se si "riavvia" l'applicazione in quel modo abbastanza volte, si otterrebbe un overflow dello stack.

Se è necessario riavviare l'applicazione senza chiudere (il che è raro), è possibile impostare un blocco try/catch all'interno del vostro main, mettere un cappio intorno ad esso, e continuare il ciclo quando si ottiene un'eccezione. Certo, questo è più di una soluzione alternativa di ogni altra cosa, perché utilizza le eccezioni per controllare il flusso del programma "normale".

+0

Non riavviare mai un'applicazione come questa. Il modo corretto per riavviare un'applicazione consiste nell'eseguire un nuovo comando Java con il percorso/le opzioni di percorso necessari del programma. – Vulcan

+0

Questo è un modo brutto di riavviare. –

+0

@Vulcan Certo, questa è una soluzione di ultima istanza, confinante con l'hack. Ho modificato la mia risposta per chiarire. – dasblinkenlight

7

Non sarà possibile riavviare l'applicazione senza uscire dalla JVM: la JVM avrà assegnato oggetti, fili ecc. E senza un sacco di pulizie non è possibile eliminarlo facilmente.

Penso che un modo più semplice sia quello di avvolgere l'applicazione in uno script e di far sì che lo script riavvii l'app se esce con un particolare codice di uscita. In questo modo puoi cestinare completamente la tua JVM tramite una chiamata System.exit(), e se lo script riavvia la tua app solo se vede un particolare codice di uscita, hai la possibilità di uscire, di uscire e di riavviare.

ad es. controlla il JavaServiceWrapper. Ciò fornisce la capacità di avviare un'applicazione Java con parametri/parametri specifici e di controllare il comportamento di restart. Si noti che fornisce uno particular API call to invoke a restart dall'interno dell'applicazione.

1

Mentre leggi quello.

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

    main(new String[0]); 
    } 

quello che sta facendo è in bnnewsaleActionPerformed si chiama main() con una nuova stringa vuota.
Questo non riavvierà l'applicazione.

Per riavviare significa arrestarsi e ricominciare.

Considerando che con il vostro codice, avvierà nuovamente la vostra applicazione all'interno dell'applicazione corrente.
Un po 'come annidarlo e avrà effetti sgradevoli, ad esempio: non azzeramento di allocazioni statiche.

0

Ecco un esempio concreto di ciò che @Brian Agnew ha già suggerito sopra.

In te codice Java, uscita con una particolare uscita per in caso di riavvio

if(restart){ 

System.exit(5); 

}else{ 
System.exit(0); 
} 

Ora creare uno script che viene effettivamente utilizzato per lanciare l'applicazione. Sto dando esempio di script batch di Windows qui, ma puoi lavorare su script simili per altri sistemi operativi.

il file batch:

@echo off 

:start 

java Test %1 
set exitcode=%ERRORLEVEL% 

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

Quando si esce con il codice di stato di 5 (può essere qualsiasi numero intero) allora si batch riavviare il programma (Test è la classe di esempio che ha principale metodo)

0

Non c'è niente di speciale nel metodo principale in java, quindi chiamare main non differisce dal chiamare nessun altro metodo. Ogni bit di inizializzazione di jvm avviene prima che il runtime java cerchi il metodo denominato "main".

Se si desidera riavviare l'applicazione senza uscire da jvm, è necessario evitare o eliminare ogni stato statico. Per casi semplici puoi semplicemente scrivere una classe per gestire la durata della tua applicazione e creare una nuova istanza di essa per un riavvio.

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

Per esempi non banali questo può ottenere brutto ThreadLocals/variabili statiche/file contrassegnati eliminare in uscita deve essere curato. Anche gli aggiornamenti alle classi di applicazioni saranno visibili solo con alcuni trucchetti del classloader.

Problemi correlati