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

  • Как импортировать build.gradle в IntelliJ
  • Как добавить переменную в Scala?
  • Как определить «тип дизъюнкции» (типы объединения)?
  • Каково ключевое слово forSome в Scala?
  • Каковы отношения между Any, AnyVal, AnyRef, Object и как они отображаются при использовании в Java-коде?
  • Как перечислить все файлы в подкаталоге в scala?
  • частный против частного
  • Разница между Iterator и Stream в Scala?
  • Как написать теорему Пифагора в Скала?
  • В Scala, что такое «ранний инициализатор»?
  • scala: memoize функция независимо от того, сколько аргументов функция принимает?
  • Interesting Posts

    Принудительное развертывание обновлений Windows во время презентации

    Функция ответа jQuery .get?

    Как определить MAC-адрес фактической физической сетевой карты – не виртуальные сетевые интерфейсы, созданные VPN (.NET C #),

    Позиционирование содержимого элементов сетки в основном контейнере (функция субgradleа)

    Как заставить git работать с pagent (putty) в Windows?

    Java: установить таймаут на определенный блок кода?

    В чем смысл + в регулярном выражении?

    Как отправить электронную почту Outlook 2007 со связанным изображением?

    Будет ли работать Trim, если вы создаете натянутый том из двух дисков (не AS RAID)

    Как читать цвет пикселя экрана

    C ++ передает массив по ссылке

    Как связать с паролем в MVVM

    Ключевое слово для внешнего classа из анонимного внутреннего classа

    Можно ли переименовать шрифты в Windows 7?

    Ток состояния CSRF не соответствует одному предоставленному FB PHP SDK 3.1.1 Oauth 2.0

    Давайте будем гением компьютера.