2017-10-02 9 views
0

以下のコードは反射についてです。 それは2つのことを行うことをしようとします。kotlinのKParameterからクラス参照を取得するには?

  1. case1()は、SimpleStudentクラスからインスタンスを作成し、それが動作します。
  2. case2()は、Studentクラスからインスタンスを作成しますが、動作しません。

case2()が動作しないことを理由だけでなく、質問は、そのgenerateValue()内ということである。

  1. 私はそれを確認する方法がわからないことはkotlinタイプや自分のタイプである(私が持っています汚い方法を確認するparam.type.toString() not contain "kotlin"しかし、より良い解決策があるのだろうか?
  2. 私は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() 
} 

答えて

1

問題が解決:

あなたが得ることができること::classparam.type.classifier as KClass<T>param is KParameter

を使用して、
関連する問題