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)

  • ¿Cómo puedo get el nombre de una propiedad de Kotlin?
  • Implementando una interfaz de kotlin en java
  • Reflexión de Kotlin: compruebe si la propiedad tiene tipo
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • Acceda al tipo de delegado de Kotlin sin una instancia
  • ¿Cómo obtengo las funciones declaradas de una class Kotlin (KClass en M12)?
  • kotlin reflexión verificación nullable types
  • por qué SomeClass :: class es KClass <SomeClass> pero esta :: class es KClass <out SomeClass>
  • Kotlin: comparar los valores de propiedad de diferentes objects objective con (fuera) reflexión
  • ¿Hay alguna manera de identificar una class de datos Kotlin de una class regular de Kotlin?
  • Interoperabilidad de reflexión de Kotlin con Java