如何通过KType获取Kotlin嵌套数据类的相对类名
问题说明
现有如下Kotlin数据类定义:
data class MyClass( val inner: MyInnerClass ) { data class MyInnerClass( val foo: String ) }
需要获取MyClass.MyInnerClass格式的嵌套类相对类名。目前已经拿到对应类的KType实例,在IntelliJ调试器中可以直接观察到这个名称(调试截图:
),但未找到公开API可以直接通过代码拿到该值。
实现方法
调试器中显示的嵌套类相对名是Kotlin调试插件内部渲染的结果,没有对外暴露直接获取的公开API,可以通过KType拿到对应KClass后,逐层向上遍历外部封闭类拼接得到目标名称,实现代码如下:
import kotlin.reflect.KClass import kotlin.reflect.KType fun KType.getNestedRelativeName(): String { val targetClass = classifier as? KClass<*> ?: throw IllegalArgumentException("当前KType不对应类类型") // 从当前类逐层向上查找外部类,直到顶级类 return generateSequence(targetClass) { current -> if (current.isNested && !current.isCompanion) { current.java.enclosingClass?.kotlin } else null } .toList() .reversed() // 反转后从外层到内层排序 .joinToString(".") { it.simpleName.orEmpty() } }
调用该扩展方法即可得到MyClass.MyInnerClass格式的相对类名,支持任意层级的嵌套类场景,同时会自动跳过伴生对象层级,避免拼接出多余的伴生对象段。
内容的提问来源于stack exchange,提问作者deflomu
相关产品推荐
相关产品推荐

