Función de llamada reflexiva y uso de parameters pnetworkingeterminados

Dada la siguiente function

fun function(x: Int = 12) { println("x = $x") } 

¿Cómo puedo usar el reflection para invocarlo sin especificar x (o de alguna manera usar el valor pnetworkingeterminado, no codificarlo con dificultad)?

Puede usar el callBy , que respeta los valores pnetworkingeterminados:

 ::function.callBy(emptyMap()) // is just function() 

Las cosas serán desorderadas si tienes muchos parameters sin valores pnetworkingeterminados:

 fun foo(a: Int, b: String = "") {} val ref = ::foo val params = ref.parameters ref.callBy(mapOf(params[0] to 1)) // is just foo(1) 

Será aún más aburrido si su function es una function miembro de un tipo no object, o su function de extensión, o es una function de extensión para un tipo como una function miembro de un (otro) tipo no object.

Escribí un método conveniente para networkingucir el text repetitivo:

 fun <R> KFunction<R>.callNamed(params: Map<String, Any?>, self: Any? = null, extSelf: Any? = null): R { val map = params.entries.mapTo(ArrayList()) { entry -> parameters.find { name == entry.key }!! to entry.value } if (self != null) map += instanceParameter!! to self if (extSelf != null) map += extensionReceiverParameter!! to extSelf return callBy(map.toMap()) } 

Uso:

 fun String.foo(a: Int, b: String = "") {} fun foo(a: Int, b: String = "") {} class Foo { fun bar(a: Int, b: String = "") {} fun String.baz(a: Int, b: String = "") {} } ::foo.callNamed(mapOf("a" to 0)) String::foo.callNamed(mapOf("a" to 0), extSelf = "") Foo::bar.callNamed(mapOf("a" to 0), Foo()) // function reference don't work on member extension functions Foo::class.declanetworkingFunctions.find { it.name == "baz" }!!.callNamed(mapOf("a" to 0), Foo(), "") 
  • ¿Cuál es el propósito de que la reference de class enlazada devuelva un tipo covariante?
  • Kotlin reflect proguard SmallSortedMapa
  • Compruebe si la class es un valor válido para KParameter