JavaFX 8 如何在几乎为空的应用程序 class 中启动 JavaFX 应用程序线程?
How does JavaFX 8 start the JavaFX Application thread in a nearly empty Application class?
比方说,我们有以下 class:
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");
}
}
它派生自 Application
但它不使用它的任何方法。通常您通过在 main.
中调用 launch(args)
来启动 JavaFX 应用程序
当我启动这个程序时,唯一的输出是 "main",因此没有调用构造函数和开始,但是程序没有终止,因为有一个 JavaFX 应用程序线程 运行。但它从何而来?
我调试了一下,发现线程是在main方法运行之前从主线程启动的。堆栈跟踪以 NativeMethodAccessorImpl
.
开头
更奇怪的是:当我从另一个 class 启动 main 方法时,JavaFX 应用程序线程没有启动:
public class Test2
{
public static void main(String[] args)
{
Test.main(args);
}
}
这是什么黑魔法?
Java 使用不同的方法启动这两个应用程序。
尝试运行以下代码:
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());
}
}
输出为
- 实际加载的主要class 测试:sun.launcher.LauncherHelper$FXHelper
- 测试 2 的实际加载主要 class:测试 2
可以看到Test2
class实际加载的主class是Test2
,但是class的加载主class
Test
是 sun.launcher.LauncherHelper$FXHelper
.
发生这种情况是因为 Java 启动器检查要启动的主 class 是否是 javafx.application.Application
的子 class。
如果是,它会加载 sun.launcher.LauncherHelper$FXHelper
的主要方法,调用启动器方法
对于 JavaFX 应用程序 (com.sun.javafx.application.LauncherImpl#launchApplication
)。
此方法负责启动 JavaFX 应用程序。 Test#main
在应用程序启动后调用:
当 Test2 调用 Test#main
时,不使用 FX 启动器,因为 Test2 不是 javafx.application.Application
的子class。
比方说,我们有以下 class:
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");
}
}
它派生自 Application
但它不使用它的任何方法。通常您通过在 main.
launch(args)
来启动 JavaFX 应用程序
当我启动这个程序时,唯一的输出是 "main",因此没有调用构造函数和开始,但是程序没有终止,因为有一个 JavaFX 应用程序线程 运行。但它从何而来?
我调试了一下,发现线程是在main方法运行之前从主线程启动的。堆栈跟踪以 NativeMethodAccessorImpl
.
更奇怪的是:当我从另一个 class 启动 main 方法时,JavaFX 应用程序线程没有启动:
public class Test2
{
public static void main(String[] args)
{
Test.main(args);
}
}
这是什么黑魔法?
Java 使用不同的方法启动这两个应用程序。
尝试运行以下代码:
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());
}
}
输出为
- 实际加载的主要class 测试:sun.launcher.LauncherHelper$FXHelper
- 测试 2 的实际加载主要 class:测试 2
可以看到Test2
class实际加载的主class是Test2
,但是class的加载主class
Test
是 sun.launcher.LauncherHelper$FXHelper
.
发生这种情况是因为 Java 启动器检查要启动的主 class 是否是 javafx.application.Application
的子 class。
如果是,它会加载 sun.launcher.LauncherHelper$FXHelper
的主要方法,调用启动器方法
对于 JavaFX 应用程序 (com.sun.javafx.application.LauncherImpl#launchApplication
)。
此方法负责启动 JavaFX 应用程序。 Test#main
在应用程序启动后调用:
当 Test2 调用 Test#main
时,不使用 FX 启动器,因为 Test2 不是 javafx.application.Application
的子class。