2015-02-04 16 views
8

phép nói rằng, chúng tôi có các lớp sau:Làm thế nào để JavaFX 8 bắt đầu chuỗi ứng dụng JavaFX trong một lớp Ứng dụng gần như trống?

import javafx.application.Application; 
import javafx.stage.Stage; 

public class Test extends Application 
{ 
    public Test() 
    { 
     System.out.println("Constructor"); 
    } 

    @Override 
    public void start(Stage primaryStage) throws Exception 
    { 
     System.out.println("start"); 
    } 

    public static void main(String... args) 
    { 
     System.out.println("main"); 
    } 
} 

Nó có nguồn gốc từ Application nhưng nó không sử dụng bất kỳ phương pháp của nó. Thông thường, bạn bắt đầu một ứng dụng JavaFX bằng cách gọi launch(args) trong chính.

Khi tôi khởi động chương trình này, đầu ra duy nhất là "chính", do đó hàm khởi tạo và bắt đầu không được gọi, nhưng chương trình không chấm dứt vì có một chuỗi ứng dụng JavaFX đang chạy. Nhưng nó đến từ đâu?

Tôi đã thực hiện một số gỡ lỗi và phát hiện ra rằng chuỗi được bắt đầu từ chuỗi chính trước khi phương thức chính chạy. Theo dõi ngăn xếp bắt đầu bằng NativeMethodAccessorImpl.

Để có được thậm chí lạ: khi tôi bắt đầu phương pháp chính từ một lớp học khác nhau, các chủ đề JavaFX Application không bắt đầu:

public class Test2 
{ 
    public static void main(String[] args) 
    { 
     Test.main(args); 
    } 
} 

Vì vậy, những loại ma thuật đen này là gì?

+0

Upvote cho ma thuật đen. – GGrec

+0

Trong lớp thứ hai, Test2, bạn chưa thêm một ứng dụng mở rộng trong khai báo lớp gốc của bạn. Vì vậy, thời gian chạy của bạn không có ý tưởng rằng quá trình JavaFX có liên quan - nó có thể là một phương thức chính (.) Của bất kỳ loại Java nào khác. – Trunk

Trả lời

5

Java sử dụng các cách tiếp cận khác nhau để khởi chạy hai ứng dụng.

Hãy thử chạy đoạn mã sau:

public class Test3 { 

    public static void main(String[] args) { 

     Class<?> actualMainClassTest = LauncherHelper.checkAndLoadMain(true, 1, Test.class.getName()); 
     Class<?> actualMainClassTest2 = LauncherHelper.checkAndLoadMain(true, 1, Test2.class.getName()); 

     System.out.println("Actual loaded main class for Test: " + actualMainClassTest.getName()); 
     System.out.println("Actual loaded main class for Test2: " + actualMainClassTest2.getName()); 
    } 
} 

Đầu ra là

  • thực tế nạp lớp chính để kiểm tra: sun.launcher.LauncherHelper $ FXHelper
  • thực tế nạp lớp học chính cho Test2: Test2

Bạn có thể thấy rằng lớp chính được tải thực tế cho 0 Lớplà Test2, nhưng lớp chính được tải cho Testsun.launcher.LauncherHelper$FXHelper.

Điều này xảy ra vì trình khởi chạy Java sẽ kiểm tra xem lớp chính có được khởi chạy hay không là lớp con của javafx.application.Application. Nếu có, nó sẽ tải phương thức chính của sun.launcher.LauncherHelper$FXHelper thay vào đó, sẽ gọi phương thức khởi chạy cho các ứng dụng JavaFX (com.sun.javafx.application.LauncherImpl#launchApplication).

Phương thức này chịu trách nhiệm khởi chạy ứng dụng JavaFX. Test#main được gọi sau khi ứng dụng được khởi động:

enter image description here

Khi Test#main được gọi bởi Test2, launcher FX không được sử dụng vì Test2 không phải là một lớp con của javafx.application.Application.

+0

Vì vậy, đó là một hành vi của java.exe và chỉ hoạt động cho javafx.application.Application? – Rafaesp

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