Kotlin: Equivalente de getClass () para KClass

93

En Java podemos resolver la clase de una variable mediante getClass()like something.getClass(). En Kotlin soy consciente de something.javaClassque está bien, pero quiero poder obtenerlo KClassde una manera similar. He visto la Something::classsintaxis pero esto no es lo que necesito. Necesito obtener el KClass de una variable. ¿Existe tal funcionalidad?

Jire
fuente

Respuestas:

143

La forma más fácil de lograr esto desde Kotlin 1.1 es la sintaxis de referencia de clase :

something::class

Si usa Kotlin 1.0, puede convertir la clase Java obtenida en una instancia de KClass llamando a la .kotlinpropiedad de extensión:

something.javaClass.kotlin
Alexander Udalov
fuente
Cualquier lugar donde pueda seguir la implementación de algo :: ¿clase?
Nishad
1
@Nishad El lugar más fácil sería mirar el bytecode generado (por ejemplo, con javap)
Alexander Udalov
2
También puede usar KClass::classpara obtener el objeto de clase actual.
Saminda Peramuna
1
Algo a tener en cuenta es que something::classregresa KClass<out Something>mientras something.javaClass.kotlinregresaKClass<Something>
KylePlusPlus
1
@SamindaPeramuna Esto es simplemente incorrecto, KClass :: class devuelve el objeto de clase kotlin.reflect.KClass, no el objeto de clase actual. Para conseguirlo tienes que usar esta :: clase.
Markus Kreusch
11

EDITAR: Vea los comentarios, a continuación, y la respuesta de Alexander, arriba. Este consejo fue originalmente para Kotlin 1.0 y parece que ahora está obsoleto.

Dado que el lenguaje aún no admite una forma directa de obtener esto, considere definir un método de extensión por ahora .

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

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

O, si prefiere una propiedad:

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

val test = 0
println("Kotlin type: ${test.kClass}")
dherman
fuente
1
Puede omitir el javabit e ir directamente a Kotlin:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob
1
Esta respuesta debe actualizarse para reflejar los cambios en 1.1. Ahora es posible obtener la clase usandosomeClass::class
Max
2

Esta es mi solucion

val TAG = javaClass.simpleName

Con javaClass.simpleName puede obtener su nombre de clase. Además, el ejemplo anterior es muy útil para que los desarrolladores de Android lo declaren en la parte superior de la clase como una variable de instancia para fines de registro.

Kashif Anwaar
fuente
1

Aquí hay diferentes implementaciones para obtener nombres de clases. Puede utilizarlo según sus necesidades.

import kotlin.reflect.KClass

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

Aquí podemos obtener el nombre de la clase en kotlin

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

Aquí podemos obtener el nombre de la clase en kotlin

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

Aquí están los resultados de las siguientes operaciones.

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
}
Muhammad Maqsood
fuente