Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:如何按名称动态访问类属性?_Scala - Fatal编程技术网

Scala:如何按名称动态访问类属性?

Scala:如何按名称动态访问类属性?,scala,Scala,如何在Scala 2.10.x中按名称动态查找对象属性的值 例如,给定类(不能是案例类): 我想做一些类似的事情: val fields = List("click", "date", "time") val row = new Row(click=true, date="2015-01-01", time="12:00:00") fields.foreach(f => println(row.getProperty(f))) // how to do this? 您还可以使用ja

如何在Scala 2.10.x中按名称动态查找对象属性的值

例如,给定类(不能是案例类):

我想做一些类似的事情:

val fields = List("click", "date", "time")
val row = new Row(click=true, date="2015-01-01", time="12:00:00")
fields.foreach(f => println(row.getProperty(f)))    // how to do this?

您还可以使用java/scala中的bean功能:

import scala.beans.BeanProperty
import java.beans.Introspector

object BeanEx extends App { 
  case class Stuff(@BeanProperty val i: Int, @BeanProperty val j: String)
  val info = Introspector.getBeanInfo(classOf[Stuff])

  val instance = Stuff(10, "Hello")
  info.getPropertyDescriptors.map { p =>
    println(p.getReadMethod.invoke(instance))
  }
}

你必须使用反射。您可以在这里查看我的答案,以在编译时实现这一点,而不是使用运行时反射:谢谢,这就像我的用例的魅力:当属性名来自其他地方(API调用)时,从类实例提取数据。调用
.setAccessible(true)
是必要的。
class Row(val click: Boolean,
      val date: String,
      val time: String)

val row = new Row(click=true, date="2015-01-01", time="12:00:00")

row.getClass.getDeclaredFields foreach { f =>
 f.setAccessible(true)
 println(f.getName)
 println(f.get(row))
}
import scala.beans.BeanProperty
import java.beans.Introspector

object BeanEx extends App { 
  case class Stuff(@BeanProperty val i: Int, @BeanProperty val j: String)
  val info = Introspector.getBeanInfo(classOf[Stuff])

  val instance = Stuff(10, "Hello")
  info.getPropertyDescriptors.map { p =>
    println(p.getReadMethod.invoke(instance))
  }
}