Java模块化项目用Gson序列化blockchain包类报反射访问错误如何解决
问题原因
这是Java 9及以上版本引入的**模块化系统(JPMS)**的访问控制规则导致的:
- Gson序列化对象时,默认会通过反射读取目标类的所有字段值,你要序列化的
Block类处于blockchain包下,归属你自己定义的noobChain模块。 - 你当前的
module-info.java只声明了项目依赖gson模块,但没有给gson模块开放blockchain包的访问权限,因此Gson的反射操作被JPMS拦截,抛出该异常。
解决方案
可以根据你的项目需求任选以下一种方案:
方案1:开放包访问权限给Gson(最推荐)
在module-info.java中新增opens声明,给Gson开放blockchain包的反射访问权限,修改后的代码如下:
module noobChain { requires gson; requires java.sql; // 新增行:开放blockchain包的反射权限给gson模块 opens blockchain to gson; }
如果你的Block类所有字段都是public的,也可以用exports blockchain to gson;代替opens声明,opens兼容私有字段的反射读取,适用范围更广。
方案2:关闭模块化约束
如果你的项目不需要用到Java模块化的隔离能力,直接删除项目中的module-info.java文件,项目会自动退回到传统的无名模块ClassPath模式,不会再有模块化的访问限制。
方案3:自定义序列化逻辑(复杂,不推荐)
为Block类手动实现Gson的JsonSerializer/JsonDeserializer接口,避免Gson用反射读取字段,适合对序列化逻辑有强自定义需求的场景。
内容的提问来源于stack exchange,提问作者Sudarshan Kannan
相关产品推荐
相关产品推荐

