reflection - 如何从kotlin中的KParameter获取类引用?

标签 reflection kotlin

下面的代码是关于反射的。
它尝试做两件事:

  • case1()SimpleStudent类创建一个实例,它可以工作。
  • case2()Student类创建一个实例,不起作用。
  • case2()与问题不一样的原因是在generateValue()内部:
  • 我不知道如何检查它是Kotlin类型还是我自己的类型(我有一种肮脏的方法来检查param.type.toString() not contain "kotlin",但我想知道是否有更好的解决方案
  • 当它是自定义类时,我不知道如何获取其类引用。问题是,即使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

    关于reflection - 如何从kotlin中的KParameter获取类引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46518588/

    相关文章:

    java - 获取可从 java 源代码调用的类中的方法列表

    android - 如何在 Android 上使用定时器进入 recyclerView

    android - 警告 : NavController. setNavigatorProvider 只能从同一个库组中调用(groupId=androidx.navigation)

    java - 将 Java 文件转换为 Kotlin 现在无法编译 - "Internal compiler error"

    kotlin - 使用Kotlin Spek和Kluent运行测试

    android - 如何使用导航组件向变化的 fragment 添加动画?

    reflection - 为什么 reflect.ValueOf 不能在 golang 中使用 Println 打印出 int 的真实值

    C# 泛型通过反射动态指定类型

    java - 方法在getDeclaredMethods()中出现,但在getDeclaredMethod()中找不到,为什么?

    c# - 在没有类型拆箱的情况下调用具有特定参数的方法