¿Cómo get la reference de class de KParameter en kotlin?

El código a continuación es sobre reflexión. Intenta hacer 2 cosas:

  1. case1() crea una instancia de la class SimpleStudent , funciona.
  2. case2() crea una instancia de Student class Student , no funciona.

La razón por la cual el case2() no funciona tan bien como la pregunta, es que dentro de ese generateValue() :

  1. No sé cómo comprobar si es del tipo kotlin o de mi propio tipo (tengo una forma sucia de comprobar que param.type.toString() not contain "kotlin" pero me pregunto si hay una solución mejor
  2. No sé cómo get su reference de class cuando se trata de una class personalizada. El problema es que aunque param.type.toString() == "Lesson" , cuando traté de get param.type::class , es de class kotlin.reflect.jvm.internal.KTypeImpl

Entonces, ¿cómo resolverlo? Gracias

==============

 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() }