我试图获得投射反射字段映射,但它给了我这个错误:
java.lang.ClassCastException: java.lang.reflect.Field cannot be cast to java.util.Map
如何解决这个问题?
最小可复制示例:
open class Base {
var inherited: Map<String, String> = mapOf(Pair("testing", "testing"))
}
class Child: Base() {
var notInherited: Int = 100
}
fun main() {
val c = Child()
var inheritedMap: Map<String, String> = c.javaClass.superclass.getDeclaredField("inherited") as Map<String, String>
println(inheritedMap)
}
链接到代码游乐场:https://pl.kotl.in/xW8g4pNsX
c.javaClass.superclass.getDeclaredField("inherited")
表示实际字段。全球概念。是的,你通过c
到达那里,但是当你运行c.javaClass
时,你已经"离开"了实例。
您需要请求字段对象去获取任何给定实例的值。在所有这些的末尾添加.get(c)
,然后瞧。
在编写代码时使用反射来访问您知道名称的东西是一种糟糕的措施-只有在您用尽所有其他可行选项时才应该使用它。你可能想要再检查几件事,可能会退回一步,询问如何做任何让你认为:我知道!我将使用反射!-也许会有更好的答案。