簡體   English   中英

Kotlin 通過 Java 反射設置惰性字段

[英]Kotlin set lazy field through Java reflection

我正在嘗試在 Kotlin 中使用 Java 反射,並且我的 Kotlin 類中有以下字段:

val tree: Tree by lazy { 
    getTree(hashGroup, service) 
}

我想通過Java反射設置這個字段,到目前為止我已經到了這一點:

val tField = transaction::class.java.getDeclaredField("tree\$delegate")
tField.isAccessible = true
tField.set(transaction, newTree)

顯然這是行不通的,因為tree字段有一個委托( tree$delegate ),它希望我將它設置為Lazy類類型而不是Tree類型。

我知道最簡單的方法是在主類中為這個字段添加一個設置器,但我不能真正修改 API,我需要這個來進行彈性測試用例。 這甚至可能嗎?

只需像往常一樣創建一個Lazy<T>實例!

如果要將其設置為常量值newTree

tField.set(transaction, lazyOf(newTree))

您還可以設置一個新的代碼塊以對其進行延遲評估:

tField.set(transaction, lazy {
    Tree().apply {
        // do something lazily to this tree...
    }
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM