gpt4 book ai didi

reflection - Scala:从字段名称反射地设置字段值

转载 作者:行者123 更新时间:2023-12-03 13:19:50 30 4
gpt4 key购买 nike

我正在学习 scala,但不知道如何做到这一点:

我正在scala对象和google appengine实体之间做一个映射器,所以如果我有这样的类:

class Student {
var id:Long
var name:String
}

我需要创建该类的一个实例,在 java 中我会通过它的名称获取字段,然后执行 field.set(object, value)但我在scala中找不到如何做到这一点。

我不能使用 java 反射,因为 Student 的字段被视为私有(private)字段,因此 field.set 会引发错误。

谢谢

最佳答案

Scala 将“var”变成了一个私有(private)字段,一个 getter 和一个 setter。因此,为了通过使用 String 标识来获取/设置 var,您需要使用 Java 反射来查找 getter/setter 方法。下面是执行此操作的代码片段。请注意,此代码在 Scala 2.8.0 下运行,并且不存在重复方法名称和错误的处理。

class Student {
var id: Long = _
var name: String = _
}

implicit def reflector(ref: AnyRef) = new {
def getV(name: String): Any = ref.getClass.getMethods.find(_.getName == name).get.invoke(ref)
def setV(name: String, value: Any): Unit = ref.getClass.getMethods.find(_.getName == name + "_$eq").get.invoke(ref, value.asInstanceOf[AnyRef])
}

val s = new Student
s.setV("name", "Walter")
println(s.getV("name")) // prints "Walter"
s.setV("id", 1234)
println(s.getV("id")) // prints "1234"

关于reflection - Scala:从字段名称反射地设置字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1589603/

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