我不知道为什么,但如果实例变量文本是私有(private)的,下面的类就不起作用,但如果我省略私有(private),它就可以工作。
调试“setField”部分中的测试,我可以看到实例变量名称应该是“text”,但它变成了“com$test$SimpleTest$$text”
package com.test
import org.testng.annotations.Test
import org.springframework.test.util.ReflectionTestUtils
class SimpleTest {
private var text = ""
@Test
def testValueOfX(): Unit = {
val simpleTest = new SimpleTest
ReflectionTestUtils.setField(simpleTest,"text", "abc")
println(
Option[String](null)
.map(v => v + " 123")
.getOrElse {
simpleTest.text + " 321"
})
}
}
我相信问题出在“getOrElse”上,因为如果我也省略,它就会起作用。
最佳答案
Scala 编译器有权将您的私有(private)字段编译为任何工作的 java 代码,因为它不会影响互操作性(如果您不采取任何技巧)。 Spring 的 setField
实际上就是这样做的,因为它使您的私有(private)字段可访问(内部的 setAccessible(true)
)。公共(public)字段始终按原样编译,以便为您提供适当的 Java 接口(interface)。
使用http://docs.scala-lang.org/overviews/reflection/environment-universes-mirrors.html使用 Scala 反射。另外this article可能会有所帮助。
Here解释了为什么 scalac 对私有(private)字段使用另一个名称。
附注删除 .getOrElse(text)
使其起作用的原因是因为除了这段代码之外,您没有在任何地方使用 text
。
关于java - Spring + Scala + 匿名 block 或类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28269357/