TL;DR
-
Javaのstatic関数はKClass.staticFunctionsで取得できる -
companion object内の関数はKClass.companionObject?.functionsで取得できる - ただし、
@JvmStaticの有無に関わらず、Kotlinのクラスで定義したメソッドはKClass.staticFunctionsで取得できない
やること
表題の通り、KClassからstatic関数/companion objectに定義した関数を取得します。
環境
JDK1.8Kotlin 1.3.61
やり方
static関数の取得
以下の方法でstatic関数の一覧が取得できます。
取得対象クラス
class Hoge {
public static void hoge();
}
取得方法
val hogeStaticMethods: Collection<KFunction<*>> = Hoge::class.staticFunctions
companion objectに定義した関数の取得
以下の方法で取得できます。
取得対象クラスのcompanion objectには名前がついてますが、名前の有無に関係なく動きます。
取得対象クラス
class HogeClass(val fuga: String) {
companion object hoge {
fun getInstance(): HogeClass = HogeClass("fuga")
}
}
所得方法
val hogeCompanionFunctions: Collection<KFunction<*>> = HogeClass::class.companionObject?.functions
補足1. この方法で取れるもの
この方法で取得した場合、object由来で以下の3つのメソッドも同時に取得されてしまいます。
equalshashCodetoString
補足2. staticFunctionsは使えないのか
「先ほど同様staticFunctionsで取得できないのか」と思いましたが、自分が試した限りでは取れませんでした。
まず、@JvmStatic無しの純粋なKotlinでは取れませんでした。
この状態でデコンパイルしてもstatic関数は出てこないので、これは予想の範疇でした。
次に@JvmStaticを付与した状態でやってみましたが、これまた取れませんでした。
デコンパイル結果を見るとstatic関数としては定義されていましたが、それでも取れないようです。
取得対象クラスでメソッドに@JvmStaticを付与した例
class HogeClass(val fuga: String) {
companion object hoge {
@JvmStatic
fun getInstance(): HogeClass = HogeClass("fuga")
}
}