我正在尝试在测试中使用私有 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
现场示例在这里
如何让这个片段可执行?
A是一个特性,Scala 将其转换为 JVM 接口。接口不能有字段,所以没有这样的字段。只有在接口实际混合到类中时才会添加基础字段。
因此,您需要做的第一件事就是将其更改classOf[A]为classOf[Test].
第二件事是更改getDeclaredField("foo")为.getDeclaredField("A$$foo").