尝试在我的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(与我一样),但没有一个出现此问题!
答案 0 :(得分:0)
由于Java 9中的模块化,因此会发生此类错误。
该错误表明gson模块希望使用反射来访问类javafx.scene.paint.Color的字段。在 java 8中,此操作很好,因为反射甚至可以用于公开私有字段,但是使用java 9时,存在一些新的反射限制,这会导致类似这样的错误一个。
就像解释here一样,在Java 9中,您不能使用反射来访问模块类型,而该类型不是由模块导出的,因此反射(如gson中使用的)将不再起作用
此问题的解决方案可能是以下之一:
$ 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;
}
}
,它会打开一个模块包,因此反射应该可以再次使用因为您提到的其他两个开发人员都没有这个问题,所以我认为他们使用的是Java 8或将库放在CLASSPATH中,因为这只是项目设置中的更改,而不是代码中的更改。因此,这就是为什么只有您面对这个问题的解释。