反射 (Reflection) 深度实践
Kotlin 反射不仅能做 Java 反射能做的事,还能处理 Kotlin 特有的语法特性(如属性、数据类解构、参数默认值)。
参数默认值调用:callBy
Java 反射的局限
如果你用 Java 反射 (Method.invoke) 调用一个带默认参数的 Kotlin 函数,你必须传入所有参数。默认值逻辑在 Java 层面是不可见的(除非用 $default 合成方法)。
解决方案:使用 KCallable.callBy。
kotlin
fun greet(name: String, msg: String = "Hello") { ... }
val func = ::greet
val nameParam = func.parameters[0]
// ✅ 只传 name,msg 自动使用默认值 "Hello"
func.callBy(mapOf(nameParam to "Bruce"))性能优化建议
- 缓存 KClass/KFunction:
::class和::function每次调用都会生成新的对象。 - 避免在热路径使用: 反射比直接调用慢 1-2 个数量级。
- R8/ProGuard: 如果启用了混淆,反射找不到类名会 Crash。务必配置
--keep规则。
kotlin
// ❌ 慢:每次循环都获取反射对象
list.forEach { it::class.simpleName }
// ✅ 快:缓存
val kClz = MyClass::class
list.forEach { kClz.simpleName }