JavaFX 模块 javafx.graphics

JavaFX module javafx.graphics

在解决了 robot.awt 的要求问题后,我现在在 运行 我的应用程序中遇到了另一个问题。应用程序构建没有问题。堆栈跟踪:

Exception in Application constructor
Exception in thread "main" java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Unable to construct Application instance: class reports.Main
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:890)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics
    at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
    at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:481)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:802)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop(WinApplication.java:174)
    ... 1 more

Process finished with exit code 1

问题的根本原因包含在这一行中:

Caused by: java.lang.IllegalAccessException: class com.sun.javafx.application.LauncherImpl (in module javafx.graphics) cannot access class reports.Main (in module Reports) because module Reports does not export reports to module javafx.graphics

Application.launch 使用反射创建应用程序实例 class 使用反射。如果 class 位于打开或导出到 Application 的包中,则仅允许像 Application 这样的外部 classes 通过反射访问您的 classes s 模块 (javafx.graphics).

您需要在 Reports 模块声明中添加以下行之一:

exports reports;
opens reports to javafx.graphics;

最后一行应该是首选,因为它的限制性更强。如果除非 reports 包还包含例如a main class/method,你应该使用第一行。

  • 如上面的回答所述Application.launch使用反射来 在 java 的帮助下创建应用程序 class 的实例 倒影
  • 但是因为模块的关系,反射默认是无法访问的
  • 在某些情况下,您必须为您的 classes,在你的情况下,你必须启用你的反射 包命名报告给模块 javafx.graphics 让 JavaFX 工作。
  • 因此,您需要模块化您的应用程序,因为 JDK、JRE 和 JavaFX 因此被模块化;在里面新建文件module-info.javasrc/main/java 在报告模块块中包含以下语句。

module reports {

requires javafx.controls;

requires javafx.media;

opens reports to javafx.graphics;

}

  • File module-info.java 将您的应用程序定义为名为 reports 并且您的模块需要一些模块,例如 (javafx.controlsjavafx.media) 才能工作。

Note: Module name reports is taken from your package name of Main class.

Why module?
Modules are a new way to organize your applications and libraries, it also enable strong encapsulation and implementation/reflection hiding.