Scala 2.10 reflection, how do I extract the field values from a case class, i.e. field list from case class

J Pullar picture J Pullar · Apr 18, 2013 · Viewed 13.3k times · Source

How can I extract the field values from a case class in scala using the new reflection model in scala 2.10? For example, using the below doesn't pull out the field methods

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

I plan to pump them into

  for {field <- fields} {
    currentMirror.reflect(caseClass).reflectField(field).get
  }

Answer

Travis Brown picture Travis Brown · Apr 18, 2013

MethodSymbol has an isCaseAccessor method that allows you to do precisely this:

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

Now you can write the following:

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)

And you get only the method symbols you want.

If you just want the actual field name (not the value prefix) and you want them in the same order then:

def getMethods[T: TypeTag]: List[String] =
  typeOf[T].members.sorted.collect {
    case m: MethodSymbol if m.isCaseAccessor => m.name.toString
  }