2009-10-19 128 views
17

我学习Scala和不能找出如何做到这一点设置字段值反思:斯卡拉:从字段名

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

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

我无法使用java反射,因为Student的字段被视为private,field.set会因此引发错误。

感谢

回答

36

斯卡拉变成 “无功” 变成了私人领域,一个getter和setter方法一个。因此,为了通过使用String识别var来获取/设置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" 
+0

谢谢!这是非常有用的,我拿了你的代码的一部分,并在Scala 2.7.6工作正常 – Damian 2009-10-19 17:52:48

+0

如果你事先知道方法参数类型,你也可以直接使用getClass.getDeclaredMethod来获取方法。 – 2012-10-17 07:02:02

+0

为什么比设置field.setAccessible(true)更好? – Yael 2017-07-05 13:52:51