繁体   English   中英

在 Kotlin 中,GSON.fromJson(...) 如何设法改变现有 object 的只读字段?

[英]In Kotlin, how does GSON.fromJson(...) manage to mutate a read-only field of an existing object?

在 Kotlin 中,如何更改实例的只读val字段?

在下面的 Kotlin 代码中, gson.fromJson(...)InstanceCreator获取一个Thing(0)并设法将value0变为1 ,然后返回 ZA8CFDE63311BD59EB2ACZC96F8666 如何?

import com.google.gson.GsonBuilder
import com.google.gson.InstanceCreator

class Thing(val value: Int)

fun main() {
    val creator = InstanceCreator { Thing(0) }
    val gson = GsonBuilder().registerTypeAdapter(Thing::class.java, creator).create()
    val thing = gson.fromJson("""{"value":1}""", Thing::class.java)
    println(thing.value) // 1
}

我验证了gson.fromJson(...)返回的 object 与InstanceCreator提供的 object 相同,因此它不会创建新的InstanceCreator

我也尝试使用反射设置value ,但没有找到方法。 val字段上没有可用的 setter。

我也尝试使用反射设置值

好吧,如果你使用 Java 的反射 API,而不是 Kotlin 的,你可以做到这一点。

Kotlin val属性转换为仅具有公共 getter 的私有 Java 字段。 您可以使用反射设置私有字段。 例如:

val x = Thing(10)
val valueField = x.javaClass.getDeclaredField("value")
valueField.trySetAccessible()
valueField.setInt(x, 20)
println(x.value)

这可能也是 Gson 在幕后所做的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM