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

Kotlin静态常量返回修改后的类名字符串问题咨询

为什么你拿到的是 TestClass$Companion 而非预期的 TestClass?

这是个很典型的Kotlin伴生对象认知误区——在伴生对象的代码块里,this 指向的不是外层的 TestClass 实例,而是伴生对象自己的实例。

Kotlin的伴生对象本质是语法糖,编译后会被转换成外层类的一个静态内部类,命名格式就是 外层类名$Companion。所以你用 this::class.java.name 时,实际获取的是这个内部类的完整类名,自然就得到了 packagePath.TestClass$Companion。

几种正确获取外层类名的方法

方法1:直接引用外层类的Class对象

最简单直接的方式,就是在伴生对象里直接指定外层类的Class:

class TestClass {
    companion object {
        @JvmField val TAG1: String = TestClass::class.java.name
        val TAG2: String = TestClass::javaClass.name
    }
}

这样不管你怎么调用,tag1 和 tag2 都会返回你预期的 packagePath.TestClass。

方法2:通过反射获取外层包含类

如果不想硬编码外层类名(比如担心后续类名重构),可以利用Java反射的 enclosingClass 属性,它会返回当前类的外层包含类:

class TestClass {
    companion object {
        @JvmField val TAG1: String = this::class.java.enclosingClass.name
        val TAG2: String = javaClass.enclosingClass.name
    }
}

这里的 enclosingClass 会指向伴生对象所属的外层 TestClass,所以也能拿到正确的类名。

补充说明

只有在普通成员函数中,this 才会指向外层类的实例,this::class 也才会对应外层类的Class。而伴生对象是独立的静态内部类,它的this作用域仅限于自身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:10