Получить список имен полей из 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.

  • В чем разница между =>, () => и Unit =>
  • Откуда возникает «плоская карта, которая имеет ***» идиоматическое выражение в Scala?
  • Требуется уточнение для лирических идентификаторов Scala (backticks)
  • частный против частного
  • Как импортировать build.gradle в IntelliJ
  • Прочитать весь файл в Scala?
  • Что такое функция приложения в Scala?
  • scala: memoize функция независимо от того, сколько аргументов функция принимает?
  • Как построить Uber JAR (FAT JAR) с использованием SBT в IntelliJ IDEA?
  • Почему объектные объекты более объектно-ориентированные?
  • Как добавить переменную в Scala?
  • Давайте будем гением компьютера.