java - 通过反射修改不可变的scala类字段

标签 java scala reflection

我需要修改从 scala 库导入的现有对象中的公共(public)不可变字段(使用 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)
}

关于java - 通过反射修改不可变的scala类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23810199/

相关文章:

scala - Akka 在 Actor 之外进行日志记录

java - 将收到的数据记录到 txt 文件

0到0.06之间的Java随机数

scala - 在可变参数中使用惰性求值函数

java - Sbt 更新显示服务器访问错误 : java. security.ProviderException : java. lang.NegativeArraySizeException

c# - 比较通用接口(interface)类型

java - 如何在 Spring 5 MVC 中将 FilePart 转换为 byte[]

java - 用java打开并刷新本地网页

Java 或 Scala : creating new types at runtime

c# - NewLateBinding.LateSet 到反射调用