やりたいこと
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