如何获取Kotlin匿名函数的参数信息?普通函数可正常获取
如何获取Kotlin匿名函数的参数信息?
问题背景
在Kotlin中,普通函数可以通过::函数名.parameters直接获取非空的参数列表:
// 普通函数示例 fun something(a: String, b: String): String { return "$a $b" } println(::something.parameters) // 输出非空参数列表
但对于赋值给变量的匿名函数,用同样方式获取参数列表会返回空:
// 匿名函数示例 var something = fun(a: String, b: String): String { return "$a $b" } println(::something.parameters) // 输出空列表
原因分析
核心差异在于:
- 普通函数的
::something是KFunction类型的函数引用,直接携带函数的元数据(包括参数信息); - 匿名函数赋值给变量后,
::something是KProperty类型的变量引用,指向的是存储函数实例的变量而非函数本身,因此无法获取函数的参数信息。
解决方案
要获取匿名函数的参数信息,需要直接对变量中的函数实例进行反射操作,而非变量本身:
方式一:Kotlin反射(推荐)
确保项目已引入kotlin-reflect依赖,将函数实例转换为KFunction类型后即可获取参数列表:
import kotlin.reflect.full.parameters var something = fun(a: String, b: String): String { return "$a $b" } // 获取匿名函数的参数列表 val functionParams = (something as KFunction<*>).parameters println(functionParams) // 输出包含两个String类型参数的列表
方式二:Java反射
如果不想引入Kotlin反射依赖,可通过Java反射获取函数的invoke方法参数:
var something = fun(a: String, b: String): String { return "$a $b" } // 遍历方法,找到invoke方法并输出参数类型 something.javaClass.methods.forEach { method -> if (method.name == "invoke") { println("参数类型:${method.parameterTypes.contentToString()}") } }
内容的提问来源于stack exchange,提问作者dbwhddn10
相关产品推荐
相关产品推荐

