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]