线程“Thread-0”中的异常 java.lang.reflect.InaccessibleObjectException
Posted
技术标签:
【中文标题】线程“Thread-0”中的异常 java.lang.reflect.InaccessibleObjectException【英文标题】:Exception in thread "Thread-0" java.lang.reflect.InaccessibleObjectException 【发布时间】:2019-06-28 08:34:48 【问题描述】:尝试在我的 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(和我一样),但他们都没有这个问题!
【问题讨论】:
从远处我们可以做的不多,可以吗;)只是猜测:尝试 --add-opens ..(与错误消息中相同)到您的 java 运行时参数 【参考方案1】:这种类型的错误是由于 java 9 中的模块化而发生的。
错误表明 gson 模块想要使用反射访问 javafx.scene.paint.Color 类的字段。在 java 8 中这可以正常工作,因为反射甚至可以用于公开私有字段,但是当 使用 java 9 时,对反射有一些新的限制,这会导致这样的错误一个。
就像here 解释的那样,在 java 9 中,您不能使用反射来访问模块类型,该类型不是由模块导出的,因此反射(如在 gson 中使用的)将不再起作用。
此问题的解决方案可能是以下之一:
使用 java 8 并且没有模块化(如果您的项目可能) 使用命令行选项--add-opens
打开一个模块的包,所以反射应该可以再次使用
在 module-info.java 文件中打开模块(这在您的情况下不起作用,因为您无权访问 javafx 的 module-info.java;只是为了完整性而提到的)
在 CLASSPATH 而不是 MODULEPATH 中添加库(javafx 和 gson),这将导致兼容模式,其中也应该可以进行反射。
因为您提到的另外两个开发人员没有这个问题,我假设他们使用 java 8 或将库放在 CLASSPATH 中,因为这只是项目设置中的更改,而不是代码中的更改。所以这将是一个解释,为什么只有你会面临这个问题。
【讨论】:
嘿!感谢您的回复!问题是,我使用的是 Java 12 :/ java 9 及以上版本可能出现此问题。大多数解决方案也适用于 java 12。以上是关于线程“Thread-0”中的异常 java.lang.reflect.InaccessibleObjectException的主要内容,如果未能解决你的问题,请参考以下文章
Could not extract response: no suitable HttpMessageConverter found for response type [class java.lan