java - Spring + Scala + 匿名 block 或类

标签 java spring scala

我不知道为什么,但如果实例变量文本是私有(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/

相关文章:

java - spring session 初始化错误

java - byte[]转为图片下载

java - 将 Spring 3.1 项目更新为 hibernate4 现在找不到当前线程的 session

java - 加特林将 TestCase ChainBuilder 数组 ["TC01","TC02", ...] 动态传递到场景

java - 在 Android 上将 Canvas 保存为位图

java - 由于某种原因,我对双链表的冒泡排序切断了列表的第一个节点

scala - 在 ScalaQuery 中重用 session ?

scala - 在 ScalaTest 中使用 JUnit @Rule(例如 TemporaryFolder)

java - 如何将 EditText 放入数组中?

java - jsp 上不显示图形