使用父类初始化子Kotlin类的快速方法'实例属性

时间:2017-12-02 21:57:52

标签: inheritance intellij-idea kotlin

我使用Java库来定义名为A的JSON模型类。这个类包含很多属性,例如:例如,从Stringa命名的26 z个属性,并且没有针对它们的构造函数。

我想在Kotlin中使用新的JSON属性扩展此类lateinit var aa: String(派生类将为B),并且可以快速创建{的实例{1}}通过复制现有B实例的属性。

我可以序列化A并将结果JSON反序列化为A。是否还有其他快速解决方案可以在没有序列化/反序列化的情况下执行此操作,例如:使用任何Kotin / Java方法或Intellij IDEA设施?

1 个答案:

答案 0 :(得分:2)

假设您只有1个构造函数,请转到:

inline fun <reified D> convert(c: Any) : D {
    val list = mutableListOf<Any>()
    c::class.java.declaredFields.forEach {
        it.isAccessible = true
        list.add(it.get(c) as String)
        it.isAccessible = false
    }

    val constructor = D::class.java.declaredConstructors[0]
    return constructor.newInstance(*list.toTypedArray()) as D
}

完全使用:

package com.erezbiox1

fun main(args: Array<String>){

    val A = A("Hey", "Hello")
    val B = convert<B>(A)
    B.print()

}

inline fun <reified D> convert(c: Any) : D {
    val list = mutableListOf<Any>()
    c::class.java.declaredFields.forEach {
        it.isAccessible = true
        list.add(it.get(c) as String)
        it.isAccessible = false
    }

    val constructor = D::class.java.declaredConstructors[0]
    return constructor.newInstance(*list.toTypedArray()) as D
}

class A(val a: String, val b: String){
    fun print(){
        println("Value is: $a, $b")
    }
}

class B(val a: String, val b: String) {
    fun print(){
        println("Value is: $a, $b")
    }
}