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]