1

尝试在我的 java 项目上运行服务器和客户端,该项目由 CLI 和 GUI 制作的棋盘游戏组成。不幸的是,我在添加用户名后出现了这个错误:

Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics does not "opens javafx.scene.paint" to module gson

这是总错误:

Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException: Unable to make field private float javafx.scene.paint.Color.red accessible: module javafx.graphics does not "opens javafx.scene.paint" to module gson
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:341)
    at java.base/java.lang.reflect.AccessibleObject.checkCanSetAccessible(AccessibleObject.java:281)
    at java.base/java.lang.reflect.Field.checkCanSetAccessible(Field.java:176)
    at java.base/java.lang.reflect.Field.setAccessible(Field.java:170)
    at gson@2.8.5/com.google.gson.internal.reflect.UnsafeReflectionAccessor.makeAccessible(UnsafeReflectionAccessor.java:44)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:159)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.CollectionTypeAdapterFactory.create(CollectionTypeAdapterFactory.java:53)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:117)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:166)
    at gson@2.8.5/com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:102)
    at gson@2.8.5/com.google.gson.Gson.getAdapter(Gson.java:458)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:926)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:892)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:841)
    at gson@2.8.5/com.google.gson.Gson.fromJson(Gson.java:813)
    at project/controller.JsonUnwrapper.sendJson(JsonUnwrapper.java:99)
    at project/network.Socket.JsonRouterSocket.run(JsonRouterSocket.java:55)
    at java.base/java.lang.Thread.run(Thread.java:835)

不知何故,javafx 和 GSON 之间似乎存在冲突。有趣的是,我使用 CLI(不需要 javafx)而不是 GUI 运行服务器和客户端。假设 Gson 应该返回一些信息(包括颜色)但是当被调用时!我什至没有执行应该返回我一些 oinfo 的命令!

可以使用 RMI 或 Sockets 进行通信,但错误仍然存​​在!

此外,这个项目是由我和另外两个人制作的。其中一个使用 Linux,另一个使用 Windows 10(就像我一样),但他们都没有这个问题!

4

1 回答 1

1

由于 java 9 中的模块化,会出现这种类型的错误。

该错误表明 gson 模块想要使用反射访问 javafx.scene.paint.Color 类的字段。在java 8 中这很好用,因为反射甚至可以用来公开私有字段,但是在使用 java 9 时,对反射有一些新的限制,会导致像这样的错误。

就像这里解释的那样,在 java 9 中,您不能使用反射来访问模块不导出的模块类型,因此反射(就像在 gson 中使用的那样)将不再起作用。

此问题的解决方案可能是以下之一:

  • 使用java 8并且没有模块化(如果可能的话)
  • 使用打开模块包的命令行选项 --add-opens,因此反射应该可以再次使用
  • 在module-info.java 文件中打开模块(这在您的情况下不起作用,因为您无权访问 javafx 的 module-info.java;只是为了完整性而提到的)
  • 在CLASSPATH 而不是MODULEPATH 中添加库(javafx 和 gson),这将导致兼容模式,其中反射也应该是可能的。

因为您提到的另外两个开发人员没有这个问题,我假设他们使用 java 8 或将库放在 CLASSPATH 中,因为这只是项目设置中的更改,而不是代码中的更改。所以这将是一个解释,为什么只有你面临这个问题。

于 2019-06-28T11:07:22.420 回答