Kotlin comtesting si la function requiere parámetro de instancia

Si se crea un KCallable utilizando Any()::toString , cuando se haga reference a él más adelante no es necesario pasar esa instancia Any (cuando se usa la call ).

Aunque si se crea utilizando Any::toString (no es una instancia de Any ), se requiere pasar una instancia Any .

Entonces mi pregunta es ¿cómo puedo averiguar fácilmente si necesito pasar ese parámetro de instancia y este parámetro es obligatorio?

Encontré una manera de hacer esto:

callable.parameters[0].kind == KParameter.Kind.INSTANCE

pero no es muy agradable y me pregunto si hay una manera más fácil o recomendada de resolver esto. ¡Gracias!

Una mejora del método sugerido es verificar la propiedad instanceParameter : si no es nula, el invocable espera una instancia:

 val isInstanceCallable = callable.instanceParameter != null 

Además, las funciones de extensión como fun Any.foo() = ... tendrán nulo en el fun Any.foo() = ... instanceParameter , y es probable que también desee verificar el fun Any.foo() = ... extensionReceiverParameter .


Además, si solo necesita trabajar con references invocables, puede verificar si tienen un receptor vinculado (es decir, la instancia a la que está vinculado). Use la propiedad boundReceiver :

 val instance = (callable as CallableReference).boundReceiver 

Cuando una reference invocable está desatada, devolverá un valor especial CallableReference.NO_RECEIVER , por lo tanto, solo tiene que comparar el valor devuelto con él:

 val bound = (callable as CallableReference).boundReceiver != CallableReference.NO_RECEIVER 

(Ejemplo ejecutable)

  • Kotlin obtiene la anotación de campo siempre vacía
  • Kotlin: ¿Cómo se accede a los methods get y setValue de un delegado?
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • Los literales de class Kotlin con el lado izquierdo vacío aún no son compatibles.
  • Determinar si una instancia es una instancia de una class de datos
  • ¿Cómo obtengo una KProperty1 de una KProperty0?
  • Kotlin: ¿Es aquí una forma inteligente de lanzar NotImplementedError para todos los methods de una class?
  • Obtén la function por nombre dinámicamente en Kotlin
  • ¿Cómo obtengo el valor de una propiedad con reflection?
  • Verificar si la function es extensión
  • El operador de Kotlin Reflection obtiene la implementación