Kotlin: equivalente a getClass () para KClass

96

Em Java, podemos resolver a classe de uma variável por meio de getClass()like something.getClass(). Em Kotlin, estou ciente de something.javaClassqual é bom, mas quero ser capaz de obter o KClassde uma maneira semelhante. Eu vi a Something::classsintaxe, mas não é disso que preciso. Eu preciso obter a KClass de uma variável. Essa funcionalidade existe?

Jire
fonte

Respostas:

149

A maneira mais fácil de fazer isso desde o Kotlin 1.1 é a sintaxe de referência de classe :

something::class

Se você usar o Kotlin 1.0, poderá converter a classe Java obtida em uma instância KClass chamando a .kotlinpropriedade de extensão:

something.javaClass.kotlin
Alexander Udalov
fonte
Onde posso acompanhar a implementação de alguma coisa :: classe?
Nishad
1
@Nishad O lugar mais fácil seria olhar o bytecode gerado (por exemplo, com javap)
Alexander Udalov
2
Você também pode usar KClass::classpara obter o objeto de classe atual.
Saminda Peramuna
1
Algo a se notar é que something::classretorna KClass<out Something>enquanto something.javaClass.kotlinretornaKClass<Something>
KylePlusPlus
1
@SamindaPeramuna Isso está errado, KClass :: class retorna o objeto de classe kotlin.reflect.KClass não o objeto de classe atual! Para obtê-lo, você deve usar esta :: classe.
Markus Kreusch
11

EDIT: Ver comentários, abaixo, e resposta de Alexandre, acima. Este conselho foi originalmente para o Kotlin 1.0 e parece que agora está obsoleto.

Como a linguagem ainda não oferece suporte a uma maneira direta de obter isso, considere definir um método de extensão por enquanto .

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

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

Ou, se preferir um imóvel:

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

val test = 0
println("Kotlin type: ${test.kClass}")
dherman
fonte
1
Você pode pular a parte javae ir direto, Kotlin:fun<T: Any> T.getClass(): KClass<out T> = this::class
TWiStErRob
1
Esta resposta deve ser atualizada para refletir as mudanças em 1.1. Agora é possível obter a classe usandosomeClass::class
Máx.
2

Aqui está minha solução

val TAG = javaClass.simpleName

Com javaClass.simpleName você pode obter o nome da sua classe. Além disso, o exemplo acima é muito útil para desenvolvedores Android declararem no topo da classe como uma variável de instância para fins de registro.

Kashif Anwaar
fonte
1

Aqui estão diferentes implementações para obter nomes de classes. Você pode utilizá-lo de acordo com suas necessidades.

import kotlin.reflect.KClass

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

Aqui podemos obter o nome da classe em kotlin

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

Aqui podemos obter o nome da classe em kotlin

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

Aqui estão as saídas para as seguintes operações.

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
fonte