Get field names list from case class
Following Andrey Tyukin solution, to get only the list of fields in Scala 2.12:
val fields: List[String] = classOf[Dummy].getDeclaredFields.map(_.getName).toList
Starting Scala 2.13
, case classes
(which are an implementation of Product
) are now provided with a productElementNames method which returns an iterator over their field's names.
From an instance of the case class (let's say case class Person(name: String, age: Int)
), one can retrieve a List
of its fields:
Person("hello", 28).productElementNames.toList
// List[String] = List(name, age)
User.getClass
does not give you the equivalent of User.class
in Java, but it gives you the class of the companion object of the User
class. You can retrieve the Class
object of User
with classOf[User]
.
edit: Oh and the User$.MODULE$
is an accessor to the singleton instance that is used internally. Think of it as the equivalent to MyClass.INSTANCE
when you are writing singletons in Java.
By using User.getClass
, you are referring to the class companion object that Scala by default creates for the case class, and not the case class itself. To get the class object of the case class, use classOf[User]
.
Alternatively, you could use Scala's reflection API to get the metadata of a case class, which gives you much more information:
import scala.reflect.runtime.universe._
def classAccessors[T: TypeTag]: List[MethodSymbol] = typeOf[T].members.collect {
case m: MethodSymbol if m.isCaseAccessor => m
}.toList
Test in sbt console:
scala> case class User(name: String, age: Int)
defined class User
scala> classAccessors[User]
res0: List[reflect.runtime.universe.MethodSymbol] = List(value age, value name)