¿Existe alguna manera de obtener el propietario de una función de Kotlin a través de la reflexión?
Supongamos que tenemos las siguientes funciones:
class MyClass {
fun myFunction() {}
companion object {
fun myStaticFunction() {}
}
}
fun myTopLevelFunction() {}
Cuando estoy depurando a través de lo siguiente:
val functions = listOf(
MyClass::myFunction,
MyClass.Companion::myStaticFunction,
::myTopLevelFunction
)
functions.forEach {
val names = (it::class.java).fields.map { method ->
println(method.name)
}
}
IntelliJ puede mostrarme correctamente esta información en “Evaluar expresión”:
- Propietario (MyClass, MyClass.Companion, etc.)
- Si esta es una función de nivel superior
Pero no puedo encontrar una forma de hacerlo a través de la reflexión. Por ejemplo, no puedo averiguar cómo leer el propietario de la función. ¿Qué me estoy perdiendo? Gracias de antemano.
En IntelliJ puedo ver los propietarios de las funciones de la siguiente manera:
myFunction -> MyClass
myStaticFunction -> MyClass.Companion
myTopLevelFunction -> MyFileNameKt
davy.ai
Para leer el propietario de una función (o la clase que la declara), puedes utilizar la propiedad
declaringClass
de la interfazKCallable
. Esta propiedad devuelve el objetoClass<*>
que representa la clase que declara la función.Por ejemplo, para imprimir los nombres de las clases que declaran cada función en la lista
functions
, puedes modificar el código de la siguiente manera:Esto producirá la siguiente salida:
Ten en cuenta que la propiedad
declaringClass
está disponible para todas las entidades ejecutables en Kotlin, incluyendo funciones, propiedades y constructores.