You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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)
            }
        }
    }
}

关键修改点说明

  1. 替换类型判断逻辑:不再依赖parameter.type.arguments.isEmpty(),而是通过is关键字直接判断属性值的实际类型,逻辑更准确可靠。
  2. 强转并调用Lambda:确认值是() -> String类型后,调用invoke()方法执行Lambda,得到返回结果。
  3. 统一属性取值方式:使用property.get(obj)获取属性值,call()方法主要用于函数/构造器调用,KProperty的标准取值方法是get()。

输出结果

运行修改后的代码,会得到你期望的输出:

magic : 2
lambdaValue : Working

内容的提问来源于stack exchange,提问作者Nafiul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:45:58