【问题标题】:How does JavaFX 8 start the JavaFX Application thread in a nearly empty Application class?JavaFX 8 如何在几乎空的 Application 类中启动 JavaFX Application 线程?
【发布时间】:2015-04-03 23:23:10
【问题描述】:

比方说,我们有以下类:

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”,所以没有调用构造函数和 start,但程序不会终止,因为有一个 JavaFX 应用程序线程正在运行。但它是从哪里来的呢?

我做了一些调试,发现线程是在main方法运行之前从主线程启动的。堆栈跟踪以NativeMethodAccessorImpl 开头。

更奇怪的是:当我从不同的类启动 main 方法时,JavaFX 应用程序线程没有启动:

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

那么这是什么黑魔法?

【问题讨论】:

  • 支持黑魔法。
  • 在第二个类Test2中,您没有在原始类声明中添加扩展应用程序。因此,您的运行时不知道涉及 JavaFX 进程 - 它可能是任何其他类型的 Java 类的 main(.) 方法。

标签: java javafx javafx-8


【解决方案1】:

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());
    }
}

输出是

  • 实际加载的测试主类:sun.launcher.LauncherHelper$FXHelper
  • Test2 实际加载的主类:Test2

可以看到Test2类的实际加载的主类是Test2,但是加载的主类为 Testsun.launcher.LauncherHelper$FXHelper

这是因为 Java 启动器检查要启动的主类是否是 javafx.application.Application 的子类。 如果是,它会加载 sun.launcher.LauncherHelper$FXHelper 的 main 方法,它会调用启动器方法 用于 JavaFX 应用程序 (com.sun.javafx.application.LauncherImpl#launchApplication)。

此方法负责启动 JavaFX 应用程序。应用启动后调用Test#main

当 Test2 调用 Test#main 时,不使用 FX 启动器,因为 Test2 不是 javafx.application.Application 的子类。

【讨论】:

  • 那么,这是 java.exe 的行为,仅适用于 javafx.application.Application?
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 2021-08-15
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
相关资源
最近更新 更多