2017-12-02 14 views
0

Aという名前のJSONモデルクラスを定義するJavaライブラリを使用します。このクラスには多くのプロパティが含まれています。例えば、012 Stringという名前のプロパティは、aからzに名前が付けられ、それらのコンストラクタはありません。親クラスのインスタンスプロパティを持つ子Kotlinクラスを高速に初期化する

私は新しいJSONプロパティ、lateinit var aa: String(派生クラスがBになります)とKotlinに、このクラスを拡張するために、既存のAインスタンスのプロパティをコピーすることによってBのインスタンスを作成するための高速な方法を持っているしたいと思います。

Aをシリアル化し、結果のJSONをBにデシリアライズすることができます。シリアライズ/デシリアライズなしでこれを行うための他の高速なソリューションはありますか?任意のKotin/JavaメソッドまたはIntellij IDEA機能を使用しますか?あなただけの1つのコンストラクタを持っていると仮定すると

+3

これは「継承オーバー構図」を叫ぶ.. –

+0

あなたはあなたにそれを提供する必要があると思います各フィールドを手動で割り当てます。 – tynn

+0

JavaライブラリからKotlinデータクラスに切り替えることができれば、組み込みのコピーメソッドが得られます。 – Les

答えて

2

は、ここに行く:

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") 
    } 
} 
関連する問題