Kotlin:KClass的getClass()等效函数

w8rqjzmb  于 2023-02-09  发布在  Kotlin
关注(0)|答案(7)|浏览(247)

在Java中,我们可以通过getClass()解析变量的类,比如something.getClass()。在Kotlin中,我知道something.javaClass,这很好,但我希望能够以类似的方式获得KClass。我已经看到Something::class语法,但这不是我需要的。我需要获得变量的KClass。这样的功能存在吗?

mnemlml8

mnemlml81#

自Kotlin1.1以来,实现这一点的最简单方法是类引用语法:

something::class

如果您使用Kotlin1.0,您可以通过调用.kotlin扩展属性将获得的Java类转换为KClass示例:

something.javaClass.kotlin
1mrurvl1

1mrurvl12#

  • 编辑:请看下面的评论和上面 Alexandria 的回答。这个建议最初是针对Kotlin1.0的,现在似乎已经过时了。*

由于该语言还不支持直接获取此内容的方法,因此consider defining an extension method for now

fun<T: Any> T.getClass(): KClass<T> {
    return javaClass.kotlin
}

val test = 0
println("Kotlin type: ${test.getClass()}")

或者,如果你喜欢一个属性:

val<T: Any> T.kClass: KClass<T>
    get() = javaClass.kotlin

val test = 0
println("Kotlin type: ${test.kClass}")
h4cxqtbf

h4cxqtbf3#

这是我的解决方案

val TAG = javaClass.simpleName

使用javaClass.simpleName你可以获得你的类名。同样上面的例子对于android开发者在类的顶部声明一个示例变量以用于日志记录是非常有用的。

luaexgnf

luaexgnf4#

这里有不同的实现来获取类名。您可以根据自己的需要使用它。

import kotlin.reflect.KClass

val <T : Any > T.kClassName: KClass<out T>
get() {
    return javaClass.kotlin
}

在这里我们可以得到Kotlin中的类名

val <T : Any > T.classNameKotlin: String?
get() {
    return javaClass.kotlin.simpleName
}

在这里我们可以得到Kotlin中的类名

val <T : Any > T.classNameJava: String
get() {
    return javaClass.simpleName
}

以下是以下操作的输出。

fun main(){

val userAge = 0

println(userAge.kClassName) 
Output: class java.lang.Integer (Kotlin reflection is not available)

println(userAge.classNameKotlin)
Output: Int

println(userAge.classNameJava)
Output: Integer
}
umuewwlo

umuewwlo5#

自Kotlin1.5.21(计算机大脑组织:kotlin标准库:1.5.21)
val TAG = javaClass.simpleName will work no more!
错误“信息不足,无法推断类型变量T”

/**
 * Returns the runtime Java class of this object.
 */
public inline val <T : Any> T.javaClass: Class<T>
    @Suppress("UsePropertyAccessSyntax")
    get() = (this as java.lang.Object).getClass() as Class<T>

@Deprecated("Use 'java' property to get Java class corresponding to this Kotlin class or cast this instance to Any if you really want to get the runtime Java class of this implementation of KClass.", ReplaceWith("(this as Any).javaClass"), level = DeprecationLevel.ERROR)
public inline val <T : Any> KClass<T>.javaClass: Class<KClass<T>>
    @JvmName("getRuntimeClassOfKClassInstance")
    @Suppress("UsePropertyAccessSyntax")
    get() = (this as java.lang.Object).getClass() as Class<KClass<T>>

您现在可以尝试YourClassName::class.java.simpleName

n3h0vuf2

n3h0vuf26#

在Kotlin:

val className = serviceClass.javaClass.name
v64noz0r

v64noz0r7#

我认为这是更好的解决方案。在这里找到https://www.techiedelight.com/determine-class-name-in-kotlin/
娱乐主频道(){

val s = "Kotlin"

println(s::class)                           // class kotlin.String
println(s::class.qualifiedName)             // kotlin.String
println(s::class.simpleName)                // String

}

相关问题