线程“ Thread-0”中的异常java.lang.reflect.InaccessibleObjectException

时间:2019-06-28 08:34:48

标签: java javafx gson accessible reflect

尝试在我的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进行通信,但两者仍然存在错误!

此外,该项目由我和另外2个人组成。其中一个使用Linux,另一个使用Windows 10(与我一样),但没有一个出现此问题!

1 个答案:

答案 0 :(得分:0)

由于Java 9中的模块化,因此会发生此类错误。

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

就像解释here一样,在Java 9中,您不能使用反射来访问模块类型,而该类型不是由模块导出的,因此反射(如gson中使用的)将不再起作用

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

  • 使用 java 8 并且不进行模块化(如果您的项目可能)
  • 使用命令行选项 $ cat bar|./foo.pl Slno Name Age Gender Exp Date 1 Google 20 Male 10 10.10.19 2 Yahoo 21 Female 11 11.11.19 $ cat foo.pl #!/usr/bin/env perl use strict; use warnings; my %myhash; print("Slno\tName\tAge\tGender\tExp\tDate\n"); while (<>) { if (/^(\S+)\s+\:\s+(.+)$/) { $myhash{$1} = $2; } else { print($myhash{'Slno'}."\t".$myhash{'Name'}."\t".$myhash{'Age'}."\t".$myhash{'Gender'}."\t".$myhash{'Exp'}."\t".$myhash{'Date'}."\n"); undef %myhash; } } ,它会打开一个模块包,因此反射应该可以再次使用
  • module-info.java文件中打开模块(由于您无权访问javafx的module-info.java,因此在您的情况下将不起作用;为完整起见,仅提及该内容)< / li>
  • CLASSPATH而不是MODULEPATH 中添加库(javafx和gson),这将导致兼容模式,在该模式下也应该可以进行反射。

因为您提到的其他两个开发人员都没有这个问题,所以我认为他们使用的是Java 8或将库放在CLASSPATH中,因为这只是项目设置中的更改,而不是代码中的更改。因此,这就是为什么只有您面对这个问题的解释。