JavaFX如何实现其应用程序执行模型
由于实施了JEP
153,因此可以启动不包含主要方法的JavaFX应用程序:增强Java命令行启动器以启动JavaFX应用程序。
这是对openjdk启动器逻辑的修改,以检查要启动的类是否扩展了Application,如果是,则调出特定于JavaFX的启动器,该启动器启动Java运行时和相关线程,创建了一个GUI窗口(用JavaFX术语然后,根据JavaFX应用程序生命周期规则,创建avaFX应用程序的实例并在该应用程序上调用init和start方法。
通过代码跟踪实现:
- main.c中的JVM调用JLILaunch在java.c
- java.c 长相 Java类sun.launcher.LauncherHelper和调用到使用JNI的Java类,调用checkAndLoadMain功能。
- 如果要启动的类没有main方法,但是扩展了JavaFX应用程序类,则将创建一个FXHelper类,其中包含启动参数。
- 通过JNI将对FXHelper的引用返回到java.c。
- java.c 调用的上FXHelper主要方法通过JNI。
- FXHelper 使用反射来调用com.sun.javafx.application.LauncherImpl.launchApplication()。
- JavaFX LauncherImpl将设置应用程序类加载器,然后首先尝试在应用程序的主类上调用main()方法。
- 如果没有main()方法,则JavaFX LauncherImpl将启动JavaFX Launcher线程。
- 在启动器线程上,LauncherImpl将在JavaFX应用程序上调用init()。
- 在JavaFX应用程序线程上,LauncherImpl将创建一个新的Stage(窗口),并将其传递给应用程序的start方法。
- 当最后一个阶段关闭或退出JavaFX平台时,应用程序上的stop方法由LauncherImpl 调用。
- 因为没有其他事情要做,所以所有的调用跟踪都将返回并且应用程序将退出。
如何自定义启动器
- 取得sun.launcher.LauncherHelper代码的副本。
- 忽略代码顶部的警告“这不是Sun Microsystems支持的任何API的一部分。如果编写依赖于此的代码,则后果自负。此代码及其内部接口可能会更改或更改。删除,恕不另行通知。” 并开始修改代码。
- 创建您自己的FXHelper版本,它将调用您自己的LauncherImpl而不是JavaFX版本(在目标主应用程序类扩展您的应用程序框架类而不是JavaFX的情况下)。
- 编写自己的LauncherImpl,为您的应用程序设置类加载器,创建应用程序类的实例,并在应用程序类型上调用所需的任何启动入口点。
- 运行您的应用程序,将被黑化的sun.launcher.LauncherHelper版本和您的LauncherImpl 放在引导类路径上,以便获取它们,而不是JDK附带的默认版本。
示例启动命令,假设要启动的目标应用程序是
com.mycompany.MyApplication:
java -Xbootclasspath/p <launcher class directory> com.mycompany.MyApplication
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)