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

标签 inheritance intellij-idea kotlin

我使用Java库定义了一个名为A的JSON模型类。此类包含许多属性,例如。例如,从String命名为a的26个z属性,并且没有用于它们的构造函数。

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

我可以序列化A并将反序列化的JSON反序列化为B。是否有其他快速解决方案可以执行此操作而无需序列化/反序列化,例如通过使用任何Kotin / Java方法或Intellij IDEA工具?

最佳答案

假设您只有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")
    }
}

关于inheritance - 使用父类的实例属性初始化子Kotlin类的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47613020/

相关文章:

c++继承Qt问题qstring

java - IntelliJ 可以在没有相应源代码的情况下反汇编第三方(或 JDK)的 java 字节码吗?

csv - 在 PyCharm 中对齐 CSV 列

kotlin - 使用 micronaut 验证其他模块的模型给出 "No bean introspection present."

c++ - 从模板继承 : scope error?

python - 除了父类(super class)之外,两个相同的 Python 类 - 如何避免重复?

java - 从子类调用重写的父类(super class)方法

java - 无法从 docker 容器连接到 mysql 主机

android - 有条件地在 Kotlin 中组合 Lambda 以过滤多个谓词

Android Notification - 如何根据模型属性创建系统