2012-10-31 32 views
6

Tôi đang nghiên cứu cách khởi động lại ứng dụng java của mình bằng cách nhấp vào nút trên GUI. Tôi đã tìm kiếm trên web và đi qua chính (chuỗi mới [0]). Tôi cần phải hiểu nếu đây là một cách hợp lệ để khởi động lại ứng dụng của tôi. Có thể ai đó xin vui lòng tư vấn cho cảm ơn.Tôi có thể sử dụng main() để khởi động lại ứng dụng của mình không?

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

    main(new String[0]); 
    } 

Chỉnh sửa Điều này có tốt hơn không?

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

Nếu GUI của ứng dụng của bạn vẫn hoạt động, thì ứng dụng đã chạy –

Trả lời

0

main() là hàm bạn đã xác định trong lớp đó.
Phải có một đối số duy nhất của loại string[].

Dòng này gọi hàm đó, giống như bất kỳ chức năng nào khác.
Nó đi một mảng chuỗi rỗng (new String[0])

Kể từ khi chức năng main() của bạn bắt đầu ứng dụng của bạn, điều này sẽ "khởi động lại" nó.

Tuy nhiên, nó sẽ không đặt lại bất kỳ trạng thái tĩnh nào.

13

Phương thức này gọi phương thức tĩnh main với một mảng chuỗi rỗng. Xem nếu điều này làm cho nó bất kỳ rõ ràng hơn:

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

Phải thừa nhận rằng đó là bất thường để gọi một phương thức main từ phương pháp phi chính ... và điều này sẽ không thực sự "khởi động lại" các ứng dụng. Nó sẽ gọi nó là từ bên trong bộ xử lý hiện tại của bạn, điều này cũng có thể gây ra hậu quả khó chịu. Tôi sẽ không giới thiệu nó.

Nếu bạn có thể tìm ra cách để bắt đầu quy trình hoàn toàn sạch sẽ, đó sẽ là "khởi động lại" đáng tin cậy hơn rất nhiều.

3

Đây không phải là cách tốt để khởi động lại ứng dụng của bạn, bởi vì lệnh gọi ban đầu của ứng dụng của bạn sẽ vẫn chạy. Nếu bạn "khởi động lại" ứng dụng của bạn như vậy đủ thời gian, bạn sẽ nhận được một tràn ngăn xếp.

Nếu bạn phải khởi động lại ứng dụng của mình mà không cần thoát (không bình thường), bạn có thể thiết lập khối try/catch bên trong main, đặt vòng lặp xung quanh và tiếp tục vòng lặp khi bạn nhận được ngoại lệ. Phải thừa nhận rằng, đây là giải pháp thay thế nhiều hơn bất kỳ điều gì khác, bởi vì nó sử dụng các ngoại lệ để kiểm soát luồng chương trình "bình thường".

+0

Vui lòng không bao giờ khởi động lại ứng dụng như vậy. Cách chính xác để khởi động lại một ứng dụng là thực thi một lệnh Java mới với các tùy chọn/đường dẫn lớp cần thiết của chương trình của bạn. – Vulcan

+0

Đó là một số cách xấu xí để khởi động lại. –

+0

@Vulcan Phải thừa nhận rằng đây là giải pháp cuối cùng, tiếp giáp với việc hack. Tôi đã chỉnh sửa câu trả lời của mình để làm rõ. – dasblinkenlight

7

Bạn sẽ không thể khởi động lại ứng dụng của mình mà không thoát khỏi JVM - JVM sẽ phân bổ các đối tượng, chủ đề vv và không có nhiều dịch vụ dọn dẹp.

Tôi nghĩ cách dễ dàng hơn là bao bọc ứng dụng của bạn trong tập lệnh và để tập lệnh khởi động lại ứng dụng của bạn nếu nó thoát bằng một mã thoát cụ thể. Bằng cách đó, bạn có thể hủy hoàn toàn JVM của mình thông qua cuộc gọi System.exit() và nếu tập lệnh chỉ khởi động lại ứng dụng của bạn nếu nó thấy một mã thoát cụ thể, bạn có tùy chọn thoát, hoặc thoát và khởi động lại.

ví dụ: hãy xem JavaServiceWrapper. Điều này cung cấp khả năng khởi động một ứng dụng Java với cấu hình/tham số cụ thể và để kiểm soát hành vi restart. Lưu ý rằng nó cung cấp một particular API call to invoke a restart từ bên trong ứng dụng của bạn.

1

Khi bạn đọc điều đó.

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

    main(new String[0]); 
    } 

Điều bạn đang làm là trên bnnewsaleActionPerformed nó đang gọi chính() bằng một chuỗi mới trống.
Điều này sẽ không khởi động lại ứng dụng của bạn.

Để khởi động lại, hãy dừng lại và bắt đầu lại.

Trong khi với mã của bạn, nó sẽ bắt đầu lại ứng dụng của bạn trong ứng dụng hiện tại ypur.
Giống như làm tổ nó và nó sẽ có tác dụng khó chịu ví dụ: không đặt lại bất kỳ phân bổ tĩnh nào.

0

Dưới đây là ví dụ cụ thể về những gì @Brian Agnew đã đề xuất ở trên.

Trong bạn mã Java, thoát với một lối đặc biệt đối với trường hợp khởi động lại

if(restart){ 

System.exit(5); 

}else{ 
System.exit(0); 
} 

Bây giờ tạo ra một kịch bản mà là thực sự sử dụng để kick bắt đầu ứng dụng của bạn. Tôi đang đưa ra ví dụ về kịch bản hàng loạt cửa sổ ở đây nhưng bạn có thể làm việc các kịch bản tương tự cho hệ điều hành khác.

Lô File:

@echo off 

:start 

java Test %1 
set exitcode=%ERRORLEVEL% 

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

Khi bạn thoát với mã trạng thái 5 (nó có thể là bất kỳ số nguyên) sau đó bạn batch sẽ khởi động lại chương trình (Test là lớp ví dụ trong đó có chính phương pháp)

0

Không có gì đặc biệt về phương pháp chính trong java, do đó, việc gọi chính không khác với việc gọi bất kỳ phương thức nào khác. Mỗi bit khởi tạo jvm xảy ra trước khi java runtime tìm kiếm phương thức có tên là "main".

Nếu bạn muốn khởi động lại ứng dụng của mình mà không thoát khỏi jvm, bạn phải tránh hoặc dọn sạch từng bit trạng thái tĩnh. Đối với các trường hợp đơn giản, bạn chỉ có thể viết một lớp để quản lý thời gian ứng dụng của bạn và tạo một phiên bản mới của nó để khởi động lại.

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

Đối với các ví dụ không đáng kể, điều này có thể gây khó khăn cho chủ đề. Các bản cập nhật cho các lớp ứng dụng sẽ chỉ hiển thị với một số thủ thuật của trình nạp lớp.

Các vấn đề liên quan