JavaFX模块JavaFX.graphics

JavaFX模块JavaFX.graphics,javafx,java-11,Javafx,Java 11,在修复robot.awt的requires问题后,我现在在运行应用程序时遇到了另一个问题。应用程序构建没有问题。堆栈跟踪: Exception in Application constructor Exception in thread "main" java.lang.reflect.InvocationTargetException at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Me

在修复robot.awt的requires问题后,我现在在运行应用程序时遇到了另一个问题。应用程序构建没有问题。堆栈跟踪:

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

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

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
使用反射创建应用程序类的实例。只有当类在打开或导出到
应用程序的模块(
javafx.graphics
)的包中接收时,像
Application
这样的外部类才允许通过反射访问您的类

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

exports reports;
opens reports to javafx.graphics;
最后一行应该是首选的,因为它是限制性更强的一行。如果除非
报告
包还包含例如
main
类/方法,否则应使用第一行。

  • 如上所述,answer Application.launch使用反射 在java的帮助下创建应用程序类的实例 倒影
  • 但是由于模块的原因,反射在默认情况下是不可访问的。
  • 在某些情况下,您必须为您的应用程序启用反射 类,在您的情况下,您必须启用 将名为reports的包发送到模块javafx.graphics,让javafx 工作
  • 因此,您需要对应用程序进行模块化,包括coz、JDK、JRE和JavaFX 因此是模块化的;在内部创建一个新文件module info.javasrc/main/java,在报告模块块中包含以下语句
模块报告{

需要javafx.controls;

需要javafx.media;

打开到javafx.graphics的报告;

}

  • java将把您的应用程序定义为一个名为 报告和您的模块需要一些模块,如(javafx.controls 和javafx.media),以便工作
注意:模块名称报告取自您的包名Main 班级

为什么选择模块?
模块是组织应用程序和应用程序的新方法 库,它还支持强大的封装和 实现/反射隐藏


需要注意的是,由于JavaFX要求
应用程序
子类及其no-arg构造函数都是公共的,因此使用限定的exports指令也可以(即
将报告导出到JavaFX.graphics
)。@fabian,在哪里编辑这两行?
模块信息.java