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?
Java verwendet verschiedene Ansätze, um die beiden Anwendungen zu starten.
Versuchen Sie, den folgenden Code auszuführen:
%Vor%Die Ausgabe ist
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.