LoginSignup
3
1

More than 3 years have passed since last update.

【Kotlin】KClassからstatic関数/companion objectに定義した関数を取得する

Posted at

TL;DR

  • Javastatic関数は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")
    }
}
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1