簡體   English   中英

通過反射修改不可變的scala類字段

[英]Modify immutable scala class field via reflection

我需要修改無法從源代碼修改的從scala庫導入的現有對象中的公共不可變字段(使用val限定符)。 如何使用反射功能? 有多種方法可以修改Java中的final字段,因此也應該有一種用於scala的方法,但是我不確定。

final class Example(src : String) {
  lazy val internal = src
}

如果重要,則內部字段為AnyRef。

附言:我知道我渴望采取絕望的措施。

您想要的絕望措施,您將得到:

import scala.util._
def modifyField( obj: AnyRef, name: String, value: Any ) {
  def impl(clazz: Class[_] ) {
    Try(clazz.getDeclaredField(name)).toOption match {
      case Some(field) => 
        field.setAccessible(true)
        clazz.getMethod(name).invoke(obj) // force init in case it's a lazy val
        field.set(obj, value) // overwrite value
      case None => 
        if (clazz.getSuperclass != null) {
          impl(clazz.getSuperclass)
        }
    }
  }
  impl(obj.getClass)
}

暫無
暫無

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

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