Как получить ссылку на класс от KParameter в котлин?

Нижеприведенный код посвящен размышлению. Он пытается сделать 2 вещи:

  1. case1() создает экземпляр класса SimpleStudent , он работает.
  2. case2() создает экземпляр класса Student , а не работает.

Причина, по которой case2() не работает так же хорошо, как вопрос, заключается в том, что внутри generateValue() :

  1. Я не знаю, как проверить, что это тип kotlin или мой собственный тип (у меня есть грязный способ проверить param.type.toString() not contain "kotlin" но мне интересно, есть ли лучшее решение
  2. Я не знаю, как получить его ссылку на класс, когда это пользовательский класс. Проблема в том, что хотя param.type.toString() == "Lesson" , когда я пытался получить param.type::class , это 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() } 

Задача решена:

Вы можете получить этот ::class , используя param.type.classifier as KClass<T> где param is KParameter