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

时间:2009-10-19 16:05:26

标签: reflection scala

我正在学习scala而无法知道如何执行此操作:

我在scala对象和google appengine实体之间进行映射,所以如果我有这样的类:

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

我需要创建该类的实例,在java中我会通过它的名字获取Field然后执行field.set(object, value)但是我无法在scala中找到如何执行此操作。

我不能使用java反射,因为Student的字段被视为私有而field.set会因此而抛出错误。

由于

1 个答案:

答案 0 :(得分:40)

Scala将“var”变成私有字段,一个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"