Kotlin反射获取Field强制转Map抛出ClassCastException如何解决
错误原因
getDeclaredField()方法返回的是java.lang.reflect.Field类型的字段元数据对象,仅存储字段的定义信息,并非该字段在指定实例上的实际取值,直接将其强转为Map类型自然会抛出类型转换异常。
修复方案
拿到Field对象后,需要调用其get()方法并传入目标实例,才能获取到该字段在实例上的实际值。此外由于Kotlin类的属性默认对应的底层字段(backing field)为私有访问权限,需要先设置isAccessible = true绕过权限校验。
修复后完整代码
open class Base { var inherited: Map<String, String> = mapOf(Pair("testing", "testing")) } class Child: Base() { var notInherited: Int = 100 } fun main() { val c = Child() // 获取字段元数据 val inheritedField = c.javaClass.superclass.getDeclaredField("inherited") // 绕过访问权限校验 inheritedField.isAccessible = true // 从目标实例中读取字段实际值 val inheritedMap: Map<String, String> = inheritedField.get(c) as Map<String, String> println(inheritedMap) }
运行后输出结果为:{testing=testing}
内容的提问来源于stack exchange,提问作者Liu
相关产品推荐
相关产品推荐

