使用 Java 反射获取 Scala 特征中的私有字段

Ole*_*leg 2 reflection scala

我正在尝试在测试中使用私有 trait 字段。非常简单的例子:

//Works fine with class A, but not trait A
trait A {  
  private val foo = "Some string"
}

class Test extends A {
  val field = classOf[A].getDeclaredField("foo")
  field.setAccessible(true)
  val str = field.get(this).asInstanceOf[String]
}
Run Code Online (Sandbox Code Playgroud)

我有:

java.lang.NoSuchFieldException: foo 在 java.lang.Class.getDeclaredField

现场示例在这里

如何让这个片段可执行?

Set*_*sue 5

A是一个特性,Scala 将其转换为 JVM 接口。接口不能有字段,所以没有这样的字段。只有在接口实际混合到类中时才会添加基础字段。

因此,您需要做的第一件事就是将其更改classOf[A]classOf[Test].

第二件事是更改getDeclaredField("foo").getDeclaredField("A$$foo").