TL;DR
--De KClass
qui peut être pris par réflexion de Kotlin
, le nom d'argument du constructeur peut être pris avec le nom d'origine.
--De la Classe
qui peut être prise par le reflet de Java
, le nom d'argument du constructeur ne peut être pris que comme" ʻarg0, ʻarg1
, ʻarg2` ... "
KClass
du code dont l'original est Java
, le nom d'argument du constructeur sera" ʻarg0, ʻarg1
, ʻarg2` ... "et le nom d'argument d'origine ne peut pas être pris.Extrayez le nom d'argument du constructeur de la classe suivante.
data class Data(val sampleInt: Int, val sampleString: String)
Vous pouvez le faire dans les deux lignes suivantes.
val clazz: KClass<Data> = Data::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }
println(parameterNames) // -> [sampleInt, sampleString]
Je vais le compléter avec le reflet de Java
(je le fais avec Java8
, il semble qu'il y ait des changements autour de la réflexion dans les versions ultérieures, mais je ne peux pas le suivre).
Ce sera comme suit.
val clazz: Class<Data> = Data::class.java
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }
println(parameterNames) // -> [arg0, arg1]
Faites-le pour la classe Java
suivante.
@Getter //Hypothèse générée par lombok
public class JavaData {
private final Integer sampleInt;
private final String sampleStr;
public JavaData(Integer sampleInt, String sampleStr) {
this.sampleInt = sampleInt;
this.sampleStr = sampleStr;
}
}
Comme indiqué ci-dessous, le nom de l'argument ne peut pas être pris.
val clazz: KClass<JavaData> = JavaData::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }
println(parameterNames) // -> [arg0, arg1]
Recommended Posts