一个人如何创建自定义的JVM启动器?

一个人如何创建自定义的JVM启动器?,第1张

一个人如何创建自定义的JVM启动器

JavaFX如何实现其应用程序执行模型

由于实施了JEP
153
,因此可以启动不包含主要方法的JavaFX应用程序:增强Java命令行启动器以启动JavaFX应用程序。

这是对openjdk启动器逻辑的修改,以检查要启动的类是否扩展了Application,如果是,则调出特定于JavaFX的启动器,该启动器启动Java运行时和相关线程,创建了一个GUI窗口(用JavaFX术语然后,根据JavaFX应用程序生命周期规则,创建avaFX应用程序的实例并在该应用程序上调用init和start方法。

通过代码跟踪实现:

  1. main.c中的JVM调用JLILaunch在java.c
  2. java.c 长相 Java类sun.launcher.LauncherHelper和调用到使用JNI的Java类,调用checkAndLoadMain功能。
  3. 如果要启动的类没有main方法,但是扩展了JavaFX应用程序类,则将创建一个FXHelper类,其中包含启动参数。
  4. 通过JNI将对FXHelper的引用返回到java.c。
  5. java.c 调用的上FXHelper主要方法通过JNI。
  6. FXHelper 使用反射来调用com.sun.javafx.application.LauncherImpl.launchApplication()。
  7. JavaFX LauncherImpl将设置应用程序类加载器,然后首先尝试在应用程序的主类上调用main()方法。
  8. 如果没有main()方法,则JavaFX LauncherImpl将启动JavaFX Launcher线程。
  9. 在启动器线程上,LauncherImpl将在JavaFX应用程序上调用init()。
  10. 在JavaFX应用程序线程上,LauncherImpl将创建一个新的Stage(窗口),并将其传递给应用程序的start方法。
  11. 当最后一个阶段关闭或退出JavaFX平台时,应用程序上的stop方法由LauncherImpl 调用。
  12. 因为没有其他事情要做,所以所有的调用跟踪都将返回并且应用程序将退出。

如何自定义启动器

  1. 取得sun.launcher.LauncherHelper代码的副本。
  2. 忽略代码顶部的警告“这不是Sun Microsystems支持的任何API的一部分。如果编写依赖于此的代码,则后果自负。此代码及其内部接口可能会更改或更改。删除,恕不另行通知。” 并开始修改代码。
  3. 创建您自己的FXHelper版本,它将调用您自己的LauncherImpl而不是JavaFX版本(在目标主应用程序类扩展您的应用程序框架类而不是JavaFX的情况下)。
  4. 编写自己的LauncherImpl,为您的应用程序设置类加载器,创建应用程序类的实例,并在应用程序类型上调用所需的任何启动入口点。
  5. 运行您的应用程序,将被黑化的sun.launcher.LauncherHelper版本和您的LauncherImpl 放在引导类路径上,以便获取它们,而不是JDK附带的默认版本。

示例启动命令,假设要启动的目标应用程序是

com.mycompany.MyApplication

java -Xbootclasspath/p <launcher class directory> com.mycompany.MyApplication


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5490398.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存