1
1

More than 3 years have passed since last update.

【Kotlin】リフレクションでコンストラクタの引数名を取得する

Posted at

TL;DR

  • Kotlinのリフレクションで取れるKClassからは、コンストラクタの引数名が元の名前で取れる
  • Javaのリフレクションで取れるClassからは、コンストラクタの引数名が「arg0, arg1, arg2...」としか取れない
  • 元がJavaのコードからKClassを取得しても、コンストラクタの引数名は「arg0, arg1, arg2...」となり、元の引数名は取れない

やること

以下のクラスから、コンストラクタの引数名を取り出します。

data class Data(val sampleInt: Int, val sampleString: String)

やり方

以下2行でできます。

val clazz: KClass<Data> = Data::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }

println(parameterNames) // -> [sampleInt, sampleString]

補足

Javaのリフレクションを絡めて補足します(Java8でやってます、これ以降のバージョンだとリフレクション周りに変更が入ってるっぽいんですが自分は追えてません)。

Javaのリフレクションでやるとどうなるか

以下のようになります。

val clazz: Class<Data> = Data::class.java
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }

println(parameterNames) // -> [arg0, arg1]

Javaのクラスに対してやるとどうなるか

以下のようなJava製クラスに対してやります。

@Getter // lombokで生成する想定
public class JavaData {
    private final Integer sampleInt;
    private final String sampleStr;

    public JavaData(Integer sampleInt, String sampleStr) {
        this.sampleInt = sampleInt;
        this.sampleStr = sampleStr;
    }
}

以下の通り、引数名は取れません。

val clazz: KClass<JavaData> = JavaData::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }

println(parameterNames) // -> [arg0, arg1]
1
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
1
1