TL;DR
-
Java
のstatic
関数はKClass.staticFunctions
で取得できる -
companion object
内の関数はKClass.companionObject?.functions
で取得できる - ただし、
@JvmStatic
の有無に関わらず、Kotlin
のクラスで定義したメソッドはKClass.staticFunctions
で取得できない
やること
表題の通り、KClass
からstatic
関数/companion object
に定義した関数を取得します。
環境
JDK1.8
Kotlin 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つのメソッドも同時に取得されてしまいます。
equals
hashCode
toString
補足2. staticFunctionsは使えないのか
「先ほど同様staticFunctions
で取得できないのか」と思いましたが、自分が試した限りでは取れませんでした。
まず、@JvmStatic
無しの純粋なKotlin
では取れませんでした。
この状態でデコンパイルしてもstatic
関数は出てこないので、これは予想の範疇でした。
次に@JvmStatic
を付与した状態でやってみましたが、これまた取れませんでした。
デコンパイル結果を見るとstatic
関数としては定義されていましたが、それでも取れないようです。
取得対象クラスでメソッドに@JvmStaticを付与した例
class HogeClass(val fuga: String) {
companion object hoge {
@JvmStatic
fun getInstance(): HogeClass = HogeClass("fuga")
}
}