scala - Scala 2.10反射,如何从案例类中提取字段值,即案例类中的字段列表

标签 scala reflection scala-2.10 case-class

如何使用scala 2.10中的新反射模型从scala中的案例类提取字段值?
例如,使用以下内容不会提取字段方法

  def getMethods[T:TypeTag](t:T) =  typeOf[T].members.collect {
    case m:MethodSymbol => m
  }

我打算把它们抽进去
  for {field <- fields} {
    currentMirror.reflect(caseClass).reflectField(field).get
  }

最佳答案

MethodSymbol 具有isCaseAccessor方法,可让您精确地执行此操作:

def getMethods[T: TypeTag] = typeOf[T].members.collect {
  case m: MethodSymbol if m.isCaseAccessor => m
}.toList

现在您可以编写以下内容:
scala> case class Person(name: String, age: Int)
defined class Person

scala> getMethods[Person]
res1: List[reflect.runtime.universe.MethodSymbol] = List(value age, value name)

而且,您仅获得所需的方法符号。

如果您只想要实际的字段名称(而不是value前缀),并且希望它们以相同的顺序,则:
def getMethods[T: TypeTag]: List[String] =
  typeOf[T].members.sorted.collect {
    case m: MethodSymbol if m.isCaseAccessor => m.name.toString
  }

关于scala - Scala 2.10反射,如何从案例类中提取字段值,即案例类中的字段列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16079113/

相关文章:

java - PropertyUtils.copyProperties 什么时候可以静默失败?

java - Gatling 中的 SSL 签名证书身份验证

scala - Scala AnyRef.clone 执行浅复制还是深复制?

scala - Scala 中的 List 不是同构集合吗?

c# - 如何验证保存/加载系统的完整性

.net - Type.GetInterface 和嵌套类型

Scala 反序列化 : class not found

scala - 自定义 Scala 枚举,搜索到的最优雅的版本

scala - scala 2.10.0 中高级类型的奇怪错误(适用于 scala 2.9.2)

multithreading - Scala中对象级别的Val和线程安全