Получить список имен полей из classа case

Мне нужно получить только имена полей classа case. Меня не интересуют его ценности. Я думал, что getClass.getDeclaredFields.map(_.getName) вернет список имен полей.

 scala> case class User(id: Int, name: String) defined class User scala> User.getClass.getDeclaredFields res14: Array[java.lang.reflect.Field] = Array(public static final User$ User$.MODULE$) scala> User.getClass.getDeclaredFields.toList res15: List[java.lang.reflect.Field] = List(public static final User$ User$.MODULE$) scala> val user = User(1, "dude") user: User = User(1,dude) scala> user.getClass.getDeclaredFields.toList res16: List[java.lang.reflect.Field] = List(private final int User.id, private final java.lang.String User.name) 

Что такое этот пользователь $ .MODULE $? Что это?

Метод getDeclaredFields отлично работает, когда у вас есть экземпляр classа case, но я не хочу создавать экземпляр, чтобы получить только поля.

Почему это не так: User.getClass.getDeclaredFields.map(_.getName) == List("id", "name") ?

Используя User.getClass , вы ссылаетесь на объект classа companion, который по умолчанию создает Scala для classа case, а не сам class case. Чтобы получить объект classа classа case, используйте classOf[User] .

Кроме того, вы можете использовать API отражения Scala для получения метаданных classа case, что дает вам гораздо больше информации:

 import scala.reflect.runtime.universe._ def classAccessors[T: TypeTag]: List[MethodSymbol] = typeOf[T].members.collect { case m: MethodSymbol if m.isCaseAccessor => m }.toList 

Тест в консоли sbt:

 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) 

User.getClass не дает вам эквивалент User.class в Java, но он дает вам class сопутствующего объекта classа User . Вы можете получить объект classа User с помощью classOf[User] .

edit : Oh и User$.MODULE$ – это аксессор к экземпляру singleton, который используется внутри. Подумайте об этом как о эквиваленте MyClass.INSTANCE когда вы пишете одиночные игры в Java.

  • Оператор <: <в scala
  • Как работает тип Dynamic и как его использовать?
  • Как импортировать build.gradle в IntelliJ
  • Scala: передать функции Seq в var-args
  • Как работает «scala.sys.process» от Scala 2.9?
  • В чем разница между определением var и val в Scala?
  • использование аргумента переменной длины в scala
  • Почему функции scala ограничены 22 параметрами?
  • Функции против методов в Scala
  • Использование Null / Nothing / Unit в Scala
  • Каково ключевое слово forSome в Scala?
  • Давайте будем гением компьютера.