我需要修改从 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/