Gson 2.10.1是否兼容Java 17?迁移报错解决方案咨询
Gson 2.10.1 兼容Java 17问题及解决方案
兼容性说明
Gson 2.10.1完全兼容Java 17,报错根源是Java 16及以上版本新增的模块系统反射访问限制,而非Gson本身不支持Java 17。
可行解决方案
1. 配置JVM启动参数开放反射权限
针对Gson需要反射访问的类或包,添加--add-opens参数,示例如下:
- 单个类开放:
--add-opens 你的包路径/你的包路径.RequiredClass=com.google.gson - 整个包开放:
--add-opens 你的包路径/你的包路径=com.google.gson - 临时全局开放(不推荐生产环境使用):
--add-opens java.base/java.lang=com.google.gson
2. 修改实体类适配Gson规则
- 给
RequiredClass添加无参构造函数,Kotlin中可借助@NoArgsConstructor注解(需引入kotlin-jvm插件):@NoArgsConstructor class RequiredClass { // 类成员 } - 将需要序列化/反序列化的私有成员改为
internal或public,或为其添加getter/setter方法 - 用
@SerializedName注解明确字段映射,减少对私有字段反射的依赖
3. 升级Gson到最新稳定版
虽然2.10.1兼容Java 17,但后续版本(如2.11.x及以上)对Java模块系统的适配更完善,能大幅减少反射权限相关问题,直接替换依赖即可。
4. 自定义TypeAdapter绕过反射
完全手动实现序列化/反序列化逻辑,避免依赖反射:
class RequiredClassTypeAdapter : TypeAdapter<RequiredClass>() { override fun write(out: JsonWriter, value: RequiredClass?) { // 自定义序列化逻辑,按需写入字段 } override fun read(`in`: JsonReader): RequiredClass { // 自定义反序列化逻辑,手动解析JSON字段并构建实例 return RequiredClass(/* 传入解析后的字段值 */) } }
注册到Gson实例:
val gson = GsonBuilder() .registerTypeAdapter(RequiredClass::class.java, RequiredClassTypeAdapter()) .create()
内容的提问来源于stack exchange,提问作者Praveen
相关产品推荐
相关产品推荐

