やりたいこと
KFunctionが渡された時、その定義元がobjectであれば、そのinstanceを取得します。
ただし、今回紹介する方法でトップレベル関数を処理するとjava.lang.UnsupportedOperationExceptionになるため注意が必要です。
やり方
以下のように、KFunctionからjavaMethodを経由することで取得できます。
もう少し素直な取得方法が無いものか確認しましたが、Kotlin 1.4.10時点ではKFunctionにdeclaringClassのようなプロパティは無く、無理そうでした。
object Foo {
fun function(i: Int) = i.toString()
}
val function: KFunction<String> = (Foo)::function
val instance: Foo = function.javaMethod!!.declaringClass.kotlin.objectInstance as Foo