【问题标题】:JavaFX module javafx.graphicsJavaFX 模块 javafx.graphics
【发布时间】:2019-04-01 19:00:23
【问题描述】:

在修复 robots.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$2(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$8(LauncherImpl.java:802)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(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$3(WinApplication.java:174)
    ... 1 more

Process finished with exit code 1

【问题讨论】:

    标签: javafx java-11


    【解决方案1】:
    • 如上所述,Application.launch 使用反射来回答 在java的帮助下创建Application类的实例 反思
    • 但是由于模块,默认情况下无法访问反射。
    • 在某些情况下,您必须为您的 类,在你的情况下,你将不得不启用你的反射 包名为报告模块 javafx.graphics 让 JavaFX 工作。
    • 因此,您需要模块化您的应用程序 coz、JDK、JRE 和 JavaFX 因此被模块化;在里面新建一个module-info.java文件 在报告模块块中使用以下语句打包 src/main/java

    module reports {

    requires javafx.controls;

    requires javafx.media;

    opens reports to javafx.graphics;

    }

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

    注意:模块名称 reports 取自您的包名称 Main 类。

    为什么选择模块?
    模块是一种组织应用程序和 库,它还可以实现强大的封装和 实现/反射隐藏。

    【讨论】:

      【解决方案2】:

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

      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 使用反射来创建应用程序类的实例。仅当 Application 之类的外部类位于打开或导出到 Application 的模块 (javafx.graphics) 的包中时,才允许通过反射访问您的类。

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

      exports reports;
      opens reports to javafx.graphics;
      

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

      【讨论】:

      • 请注意,由于 JavaFX 要求 Application 子类及其无参数构造函数都是公共的,因此使用合格的导出指令也可以正常工作(即 exports reports to javafx.graphics)。
      • module-info.java
      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多