如何从Kotlin工厂函数中高效获取目标类的simpleName
如何从Kotlin工厂函数中高效获取目标类的simpleName
嘿,完全懂你想简化调用又不想浪费性能的心情!原来用SmModule::class.java确实有点繁琐,换成::SmModule看着清爽太多,但为了拿个类名就实例化对象确实没必要,这就给你分享个高效的方案。
核心思路:利用Kotlin反射读取工厂函数的元数据
我们不需要实例化对象,只要通过反射获取工厂函数的返回类型信息就行,开销极小。这里分两种方式实现:
方式一:直接声明参数为KFunction0<T>(更直观)
把你的set函数参数类型从() -> T改成KFunction0<T>,这样可以直接拿到函数的反射信息:
import kotlin.reflect.KFunction0 import kotlin.reflect.KClass override fun <T : IMyModule> set(key: String, value: String, type: KFunction0<T>) { // 获取返回类型对应的KClass val targetClass = type.returnType.classifier as KClass<*> // 拿到simpleName,这里加了空值处理避免空指针 val settings = targetClass.simpleName ?: "UnknownClass" // 你的后续逻辑... } // 调用的时候还是保持简洁的写法 set("COM", "1", ::SmModule)
方式二:保留() -> T参数,内部转成反射对象
如果不想修改参数类型,也可以在函数内部把传入的工厂函数转成KFunction0<T>来处理:
import kotlin.reflect.KFunction0 import kotlin.reflect.KClass override fun <T : IMyModule> set(key: String, value: String, type: () -> T) { // 安全转换为KFunction0,避免非法输入 val kFunction = type as? KFunction0<T> ?: error("请传入合法的类构造函数引用") // 获取返回类型的KClass val targetClass = kFunction.returnType.classifier as? KClass<*> ?: error("无法从函数引用获取目标类信息") // 拿到类名 val settings = targetClass.simpleName ?: "UnknownClass" // 你的后续逻辑... } // 调用方式不变 set("COM", "1", ::SmModule)
注意事项:添加Kotlin反射依赖
上面的方案需要用到Kotlin反射库,如果你的项目还没引入,记得在构建脚本里添加依赖(以Gradle为例):
// 确保版本和你的Kotlin版本一致 implementation("org.jetbrains.kotlin:kotlin-reflect:${kotlin_version}")
为什么这个方案高效?
这个方法只是读取工厂函数的元数据信息(也就是函数返回类型的类信息),完全不会实例化目标类对象,和你原来用Class<T>的方式性能几乎一致,同时还保持了调用时的简洁性。
备注:内容来源于stack exchange,提问作者Ernis
相关产品推荐
相关产品推荐

