Wie startet JavaFX 8 den JavaFX-Anwendungs-Thread in einer fast leeren Application-Klasse?

8

Sagen wir, wir haben die folgende Klasse:

%Vor%

Er stammt von Application , verwendet jedoch keine seiner Methoden. Normalerweise starten Sie eine JavaFX-Anwendung, indem Sie im Hauptverzeichnis launch(args) aufrufen.

Wenn ich dieses Programm starte, ist die einzige Ausgabe "main", also werden der Konstruktor und der Start nicht aufgerufen, aber das Programm wird nicht beendet, weil ein JavaFX-Anwendungs-Thread läuft. Aber woher kommt es?

Ich habe ein Debugging durchgeführt und festgestellt, dass der Thread vom Hauptthread gestartet wird, bevor die Hauptmethode ausgeführt wird. Der Stack-Trace beginnt mit NativeMethodAccessorImpl .

Um noch seltsamer zu werden: Wenn ich die main-Methode von einer anderen Klasse aus starte, wird der JavaFX-Anwendungs-Thread nicht gestartet:

%Vor%

Was für eine Art von schwarzer Magie ist das?

    
Mr. Clear 04.02.2015, 12:26
quelle

1 Antwort

5

Java verwendet verschiedene Ansätze, um die beiden Anwendungen zu starten.

Versuchen Sie, den folgenden Code auszuführen:

%Vor%

Die Ausgabe ist

  • Tatsächlich geladene Hauptklasse für Test: sun.launcher.LauncherHelper $ FXHelper
  • Tatsächlich geladene Hauptklasse für Test2: Test2

Sie sehen, dass die tatsächlich geladene Hauptklasse für die Klasse Test2 Test2 ist, aber die geladene Hauptklasse für Test ist sun.launcher.LauncherHelper$FXHelper .

Dies geschieht, weil der Java-Launcher prüft, ob die Hauptklasse, die gestartet werden soll, eine Unterklasse von javafx.application.Application ist. Wenn dies der Fall ist, wird stattdessen die Hauptmethode von sun.launcher.LauncherHelper$FXHelper geladen, die eine Startmethode aufruft für JavaFX-Anwendungen ( com.sun.javafx.application.LauncherImpl#launchApplication ).

Diese Methode ist verantwortlich für den Start der JavaFX-Anwendung. Test#main wird nach dem Start der Anwendung aufgerufen:

Wenn Test#main von Test2 aufgerufen wird, wird der FX-Launcher nicht verwendet, da Test2 keine Unterklasse von javafx.application.Application ist.

    
Modus Tollens 04.02.2015, 18:05
quelle

Tags und Links