Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin: Equivalent of getClass() for KClass

Tags:

java

class

kotlin

People also ask

How do you get KClass in Kotlin?

A KClass represents a class and provides introspection capabilities. Since Kotlin 1.1, you can use the ::class syntax to get the KClass . There are several different implementations to get the class name as per your requirements. Additionally, you can use KClass.

What is KClass in Kotlin?

The KClass type is Kotlin's counterpart to Java's java. lang. Class type. It's used to hold references to Kotlin classes; you'll see what it lets you do with those classes in the “Reflection” section later in this chapter. The type parameter of KClass specifies which Kotlin classes can be referred to by this reference.

What does :: mean in Kotlin?

:: is just a way to write a lambda expression basically we can use this to refer to a method i.e a member function or property for example class Person (val name: String, val age: Int) Now we can write this to access the person which has the maximium age.

How do I print a variable type in Kotlin?

In Kotlin, Printing variable is much easy compare than other languages. Add dollar sign($) in front of any variable, print or println function prints output on the screen.


The easiest way to achieve this since Kotlin 1.1 is the class reference syntax:

something::class

If you use Kotlin 1.0, you can convert the obtained Java class to a KClass instance by calling the .kotlin extension property:

something.javaClass.kotlin

EDIT: See comments, below, and answer from Alexander, above. This advice was originally for Kotlin 1.0 and it seems is now obsolete.

Since the language doesn't support a direct way to get this yet, 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()}")

Or, if you prefer a property:

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

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

Here's my solution

val TAG = javaClass.simpleName

With javaClass.simpleName you can obtain your class name. Also the above example is very useful for android developers to declare on top of the class as an instance variable for logging purposes.


Here are different Implementations to get class names. You can utilize it as per your requirements.

import kotlin.reflect.KClass

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

Here we can get the class name in kotlin

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

Here we can get the class name in kotlin

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

Here are the outputs to the following operations.

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
}

In Kotlin:

val className = serviceClass.javaClass.name

Since Kotlin 1.5.21 (org.jetbrains.kotlin:kotlin-stdlib:1.5.21)

val TAG = javaClass.simpleName will work no more!

Error "Not enough information to infer type variable 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>>

You can try now YourClassName::class.java.simpleName