TL;DR
KClass
, das durch Reflektion von Kotlin
übernommen werden kann, kann der Argumentname des Konstruktors mit dem ursprünglichen Namen übernommen werden.Klasse
, die durch die Reflexion von Java
übernommen werden kann, kann der Argumentname des Konstruktors nur als" arg0
, arg1
, arg2
..." verwendet werden. arg0
, arg1
, arg2
... "und der ursprüngliche Argumentname kann nicht übernommen werden.Extrahieren Sie den Argumentnamen des Konstruktors aus der folgenden Klasse.
data class Data(val sampleInt: Int, val sampleString: String)
Sie können dies in den folgenden zwei Zeilen tun.
val clazz: KClass<Data> = Data::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }
println(parameterNames) // -> [sampleInt, sampleString]
Ich werde es mit der Reflexion von "Java" ergänzen (ich mache es mit "Java8", es scheint, dass es Änderungen in der Reflexion in späteren Versionen gibt, aber ich kann es nicht folgen).
Es wird wie folgt sein.
val clazz: Class<Data> = Data::class.java
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }
println(parameterNames) // -> [arg0, arg1]
Tun Sie dies für die folgende Java-Klasse.
@Getter //Annahme durch Lombok erzeugt
public class JavaData {
private final Integer sampleInt;
private final String sampleStr;
public JavaData(Integer sampleInt, String sampleStr) {
this.sampleInt = sampleInt;
this.sampleStr = sampleStr;
}
}
Wie unten gezeigt, kann der Argumentname nicht übernommen werden.
val clazz: KClass<JavaData> = JavaData::class
val parameterNames: List<String> = clazz.constructors.first().parameters.map { it.name }
println(parameterNames) // -> [arg0, arg1]
Recommended Posts