gpt4 book ai didi

java - Spring + Scala + 匿名 block 或类

转载 作者:行者123 更新时间:2023-12-02 05:01:15 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com