2017-12-02 271 views
0

我使用Java庫定義名爲A的JSON模型類。這個類包含很多屬性,例如,從az,並且沒有它們的構造函數。用父類的實例屬性初始化子類Kotlin類的快速方法

我想在科特林一個新的JSON財產繼承這個類,lateinit var aa: String(派生類會B),並有一個快速的方式通過複製現有A實例的屬性來創建的B一個實例。

我可以序列化A並將結果JSON反序列化爲B。有沒有其他的快速解決方案可以做到這一點,而無需序列化/反序列化,例如通過使用任何Kotin/Java方法或Intellij IDEA工具?

+3

這尖叫「在繼承組成」 .. –

+0

你必須提供它在你的構造函數並手動分配每個字段。 – tynn

+0

如果您可以從Java庫切換到Kotlin數據類,您將獲得內置的複製方法。 – Les

回答

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") 
    } 
}