如何使用Kotlin反射调用构造方法的默认Lambda?
解决Kotlin反射调用Lambda属性的问题
你遇到的核心问题是反射获取到的Lambda属性值被推断为Any类型,无法直接调用。解决思路是将获取到的属性值强转为对应的函数类型,再调用其invoke()方法。
修改后的完整代码
data class MyClass( var magic: Int = 2, var lambdaValue: () -> String = { "Working" } ) fun main(args: Array<String>) { val clazz = MyClass::class val obj = clazz.createInstance() val memberProperties = clazz.memberProperties clazz.constructors.forEach { cons -> cons.parameters.forEach { parameter -> val property = memberProperties.find { it.name == parameter.name } print("${parameter.name} : ") val value = property?.get(obj) when (value) { is () -> String -> println(value.invoke()) // 强转为无参函数类型并调用 else -> println(value) } } } }
关键修改点说明
- 替换类型判断逻辑:不再依赖
parameter.type.arguments.isEmpty(),而是通过is关键字直接判断属性值的实际类型,逻辑更准确可靠。 - 强转并调用Lambda:确认值是
() -> String类型后,调用invoke()方法执行Lambda,得到返回结果。 - 统一属性取值方式:使用
property.get(obj)获取属性值,call()方法主要用于函数/构造器调用,KProperty的标准取值方法是get()。
输出结果
运行修改后的代码,会得到你期望的输出:
magic : 2 lambdaValue : Working
内容的提问来源于stack exchange,提问作者Nafiul
相关产品推荐
相关产品推荐

