0
以下のコードは反射についてです。 それは2つのことを行うことをしようとします。kotlinのKParameterからクラス参照を取得するには?
case1()
は、SimpleStudent
クラスからインスタンスを作成し、それが動作します。case2()
は、Student
クラスからインスタンスを作成しますが、動作しません。
case2()
が動作しないことを理由だけでなく、質問は、そのgenerateValue()
内ということである。
- 私はそれを確認する方法がわからないことはkotlinタイプや自分のタイプである(私が持っています汚い方法を確認する
param.type.toString() not contain "kotlin"
しかし、より良い解決策があるのだろうか? - 私は
param.type::class
を取得しようとしたときに、param.type.toString() == "Lesson"
でも、それはクラスの参照を取得する方法がわからない。class kotlin.reflect.jvm.internal.KTypeImpl
だから、どのように解決するのですか?おかげ
==============
import kotlin.reflect.KParameter
import kotlin.reflect.full.primaryConstructor
import kotlin.test.assertEquals
data class Lesson(val title:String, val length:Int)
data class Student(val name:String, val major:Lesson)
data class SimpleStudent(val name:String, val age:Int)
fun generateValue(param:KParameter, originalValue:Map<*,*>):Any? {
var value = originalValue[param.name]
// if (param.type is not Kotlin type){
// // Get its ::class so that we could create the instance of it, here, I mean Lesson class?
// }
return value
}
fun case1(){
val classDesc = SimpleStudent::class
val constructor = classDesc.primaryConstructor!!
val value = mapOf<Any,Any>(
"name" to "Tom",
"age" to 16
)
val params = constructor.parameters.associateBy (
{it},
{generateValue(it, value)}
)
val result:SimpleStudent = constructor.callBy(params)
assertEquals("Tom", result.name)
assertEquals(16, result.age)
}
fun case2(){
val classDesc = Student::class
val constructor = classDesc.primaryConstructor!!
val value = mapOf<Any,Any>(
"name" to "Tom",
"major" to mapOf<Any,Any>(
"title" to "CS",
"length" to 16
)
)
val params = constructor.parameters.associateBy (
{it},
{generateValue(it, value)}
)
val result:Student = constructor.callBy(params)
assertEquals("Tom", result.name)
assertEquals(Lesson::class, result.major::class)
assertEquals("CS", result.major.title)
}
fun main(args : Array<String>) {
case1()
case2()
}