2012-10-31 4 views
6

GUI에서 단추를 클릭하여 Java 응용 프로그램을 다시 시작하는 방법을 연구 중입니다. 나는 웹을 검색하여 메인 (새로운 String [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[] 유형의 단일 인수를 사용합니다.

이 줄은 다른 함수와 마찬가지로이 함수를 호출합니다.
그것은이 그것을 "다시 시작"할 것이다, 당신의 main() 기능은 응용 프로그램을 시작하기 때문에 빈 문자열 배열 (new String[0])

를 전달합니다.

그러나 정적 상태는 재설정되지 않습니다.

13

정적 문자열 main을 빈 문자열 배열로 호출합니다. 이 수 있는지 그 어떤 명확한 :

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

인정 하듯이 아닌 main 메소드에서 main 메소드를 호출하는 이례적인 ...이 것 정말 "다시 시작"응용 프로그램. 기존 핸들러에서 으로 전화를 걸면 좋지 않은 결과가 발생할 수 있습니다. 나는 그것을 추천하지 않을 것이다.

완전히 깨끗한 프로세스를 시작하는 방법을 찾으면 훨씬 더 안정적인 "다시 시작"이됩니다.

3

이것은 응용 프로그램의 초기 호출이 여전히 실행 중이므로 응용 프로그램을 다시 시작하는 좋은 방법이 아닙니다. 그렇게 충분한 시간 동안 응용 프로그램을 "다시 시작"하면 스택 오버플로가 발생합니다.

당신이 (예외적 인), 그리고 만약 당신이, 당신의 main 내부 try/catch 블록을 설정 주위에 루프를 넣어, 당신은 예외를 얻을 때 루프를 계속할 수를 종료하지 않고 응용 프로그램을 다시 시작해야합니다. 이것은 정상적인 프로그램 흐름을 제어하기 위해 예외를 사용하기 때문에 다른 것보다 해결 방법이 더 많습니다.

+0

이렇게 애플리케이션을 다시 시작하지 마십시오. 응용 프로그램을 다시 시작하는 올바른 방법은 프로그램의 필수 클래스 경로/옵션을 사용하여 새 Java 명령을 실행하는 것입니다. – Vulcan

+0

다시 시작하는 것은 추악한 방법입니다. –

+0

@ Vulcan 틀림없이, 이것은 해킹에 접하는 마지막 수단의 해결책입니다. 내 대답을 편집하여 명확하게했습니다. – dasblinkenlight

7

JVM을 끝내지 않고 응용 프로그램을 다시 시작할 수는 없습니다. JVM은 객체, 스레드 등을 할당 할 것이고 많은 정리 작업 없이도 이것을 쉽게 휴지통에 버릴 것입니다.

더 쉬운 방법은 스크립트로 응용 프로그램을 포장하고 특정 종료 코드로 종료하면 스크립트를 다시 시작하는 것입니다. 그렇게하면 System.exit() 호출을 통해 JVM을 완전히 삭제할 수 있으며 특정 종료 코드가있는 경우에만 스크립트가 앱을 다시 시작하면 종료하거나 종료 한 다음 다시 시작할 수 있습니다.

JavaServiceWrapper을 확인하십시오. 이를 통해 특정 구성/매개 변수로 Java 응용 프로그램을 시작하고 restart 동작을 제어 할 수 있습니다. 응용 프로그램 내에서 particular API call to invoke a restart을 제공합니다.

1

당신이 그것을 읽으면서.이 비어있는 새로운 문자열) (주 호출 bnnewsaleActionPerformed에 일을 무엇

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

    main(new String[0]); 
    } 

이다.
응용 프로그램이 다시 시작되지 않습니다.

다시 시작하려면 다시 중지했다가 다시 시작하십시오.

코드를 사용하면 ypur 현재 응용 프로그램에서 응용 프로그램을 다시 시작합니다.
비슷한 종류의 중첩과 정적 할당을 재설정하지 않는 등의 불쾌한 효과가 있습니다.

0

@Brian Agnew가 이미 위에서 제안한 내용의 구체적인 예는 다음과 같습니다.

에서 당신 자바 코드, 재시작의 경우

if(restart){ 

System.exit(5); 

}else{ 
System.exit(0); 
} 

지금 실제로 응용 프로그램을 걷어차 기 시작하는 데 사용되는 스크립트를 생성하기위한 특정 종료와 함께 종료합니다. 여기에 Windows 배치 스크립트 예제를 제공하고 있지만 다른 OS에서 비슷한 스크립트를 사용할 수 있습니다.

배치 파일 : 당신이 5의 상태 코드 종료 후 일괄 프로그램을 다시 시작합니다 (이 정수가 될 수 있습니다) 때

@echo off 

:start 

java Test %1 
set exitcode=%ERRORLEVEL% 

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

(Test 메인이 예제 클래스 method)

0

java에서 main 메소드에 특별한 것은 없으므로 main 호출은 다른 메소드 호출과 다르지 않습니다. jvm 초기화의 모든 비트는 Java 런타임이 "main"이라는 메소드를 검색하기 전에 발생합니다.

jvm을 종료하지 않고 응용 프로그램을 다시 시작하려면 정적 상태의 모든 비트를 피하거나 정리해야합니다. 간단한 경우 응용 프로그램 수명을 관리하고 재시작 할 수 있도록 인스턴스를 새로 만들 수있는 클래스를 작성할 수 있습니다. 이 추한 ThreadLocals을/정적 변수/파일을 얻을 수있는 비 사소한 예를 들어

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

가 알아서 할 필요가 출구에 삭제 표시했다. 또한 애플리케이션 클래스에 대한 업데이트는 일부 클래스 로더의 속임수로만 볼 수 있습니다.