Manera idiomática de invocar methods a través de la reflexión en Kotlin

Tengo un fragment del código de Kotlin que intenta invocar de manera reflexiva un método que usa el package Reflection de Java:

val arguments = arrayOfNulls<Any>(numberOfParams) // Populate arguments try { fooMethod.invoke(fooClass, arguments) } catch (e: Exception) { // Panic } 

Sigue fallando con una exception IllegalArgumentException de "número incorrecto de parameters".

Leí algo sobre el tema y parece que el operador de difusión del método invoke() se niega a descomprimir Array<Any> porque no es equivalente a Object[] . Podría intentar usar un Object[] estándar de Java, pero me pregunto, ¿es esta la única manera? ¿Es la mejor manera? ¿Hay alguna manera de que pueda hacer esto con los types de Kotlin?

¿Cuál es la forma más idónea de lograr lo que quiero en Kotlin?

Debe agregar el operador de extensión * a su llamada:

 fooMethod.invoke(fooClass, *arguments) 

El uso de arguments sin prefijarlo con * causará que una nueva matriz de longitud 1 contenga arguments como su único elemento que se creará y pasará como arguments para invoke . Prefijándolo con el operador de propagación hace que la matriz de arguments se pase para invoke como arguments .

Consulte Número variable de arguments (Varargs) – Funciones – Idioma de progtwigción de Kotlin para get más detalles.

  • Verificar si la function es extensión
  • ¿El comstackdor de Kotlin siempre conserva los nombres de los parameters en bytecode?
  • Kotlin invoke getter / setter reflexivamente
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • ¿Por qué == e iguales producen resultados diferentes?
  • kotlin reflexión verificación nullable types
  • ¿Es seguro llamar a kclass.memberProperties en un object desconocido (Cualquiera)?
  • Reflexión de Kotlin: compruebe si la propiedad tiene tipo
  • java.lang.IllegalArgumentException: Callable espera 4 arguments, pero se proporcionaron 3
  • ¿Cómo get una class de time de ejecución de una variable en Kotlin?
  • Los literales de class Kotlin con el lado izquierdo vacío aún no son compatibles.