2015-09-23

Kotlinことはじめ:(12)リフレクションその1

書いてるうちに、M13がリリースされました
今回は、クラスのメタ情報を取得するリフレクションです。
Kotlinではクラスのメタ情報はKClassというクラスで表現されます。

クラスからメタ情報を取得する

メタ情報を取得する対象のクラスがわかっている場合は、以下のように取得することができます。

val kclass = SomeClass::class

オブジェクトからメタ情報を取得する

対象のクラスがわからず、オブジェクトからメタ情報を取得する場合は、以下のように取得します。

val kclass = obj.javaClass.kotlin
現状(M13現在)直接オブジェクトからKClassのオブジェクトを取得することができないため、一旦JavaのClassクラスのオブジェクトを取得し、そこからKClassのオブジェクトを取得します。

KClassオブジェクトからJavaのClassオブジェクトを取得する

JavaのClassオブジェクトからKClassのオブジェクトを取得するのとは逆に、KClassのオブジェクトからClassのオブジェクトを取得する事もできます。
と言うか、現状リフレクションの機能がKClassに全て揃っているわけではないので、Javaでリフレクションを使うことを意識した実装をKotlinで行う場合は、JavaのClassを取得する必要があります。

val jclass = kclass.java

クラスメンバのメタ情報を取得する

KClassオブジェクトからメンバのメタ情報を取得するには以下のようにします。
for(member in kclass.members) {
    when(member) {
        is KFunction -> {
            関数向けの処理
        }
        is KProperty -> {
            プロパティ向けの処理
        }
    }
}
現状、メンバをリストで取得することしかできません。
特定の名前のメンバを取得したい場合などは、Javaの機能を使用するか、ループで各メンバ名前をチェックする必要があります。

メンバ関数

関数に限定する場合は以下のように。
for(function in kclass.memberFunctions) {
    関数向けの処理
}

プロパティ

関数に限定する場合は以下のように。
for(property in kclass.memberProperties) {
    プロパティ向けの処理
}

拡張関数/プロパティ

このクラスを対象にした拡張関数/プロパティを取得したい場合は、以下のようにします。
for(function in kclass.memberExtensionFunctions) {
    関数向けの処理
}
for(property in kclass.memberExtensionProperties) {

    プロパティ向けの処理
}

コンストラクタのメタ情報を取得する

コンストラクタのメタ情報は以下のように取得します。
for(cnstrctr in kclass.constractors) {
    処理
}
プライマリコンストラクタを特定して取得するには以下の通り。
val pcnstrctr = kclass.primaryConstractors

他にもありますが、詳しくはAPIリファレンスを。
次回は今回の内容で取得された関数/プロパティ/コンストラクタのメタ情報について書きます。

0 件のコメント: