斯卡拉:从字段名沉思设置字段值(Scala: set a field value reflectiv

2019-08-20 16:11发布

我正在学习Scala和不能找出如何做到这一点:

我在做斯卡拉对象和谷歌的AppEngine实体之间的映射,所以如果我有一类这样的:

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

我需要创建一个类的实例,在Java中我会被它的名字得到了现场,然后做field.set(object, value)但我无法找到如何在斯卡拉这样做。

因为学生的领域被视为私人和field.set抛出,因为一个错误,我不能使用Java反射。

谢谢

Answer 1:

斯卡拉变成“无功”变成了私人领域,一个getter和setter方法一个。 因此,为了通过使用一个字符串,标识它来获取/设置一个变种,你需要使用Java反射来寻找getter / setter方法。 下面的代码片段做到这一点。 请注意,这个代码斯卡拉2.8.0下运行,并且复制方法的名称和错误的handlings是不存在的。

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"


文章来源: Scala: set a field value reflectively from field name