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
相关产品推荐
相关产品推荐

