[英]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)
并设法将value
从0
变为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.