es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para leer el propietario de una función (o la clase que la declara), puedes utilizar la propiedad declaringClass de la interfaz KCallable. Esta propiedad devuelve el objeto Class<*> 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:

    val functions = listOf(
        MyClass::myFunction,
        MyClass.Companion::myStaticFunction,
        ::myTopLevelFunction
    )
    functions.forEach { function ->
        val ownerName = function.declaringClass.simpleName
        println("${function.name} -> $ownerName")
    }
    

    Esto producirá la siguiente salida:

    myFunction -> MyClass
    myStaticFunction -> MyClass.Companion
    myTopLevelFunction -> ReflectionTestKt
    

    Ten en cuenta que la propiedad declaringClass está disponible para todas las entidades ejecutables en Kotlin, incluyendo funciones, propiedades y constructores.

Comments are closed.