Получить список имен полей из 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, но я не хочу создавать экземпляр, чтобы получить только поля.
- Примеры монады штата Скалаз
- Как применить функцию к кортежу?
- Как вы делаете инъекцию зависимостей с шаблоном Cake без hardcoding?
- Шаблон Loaner в Scala
- В чем разница между «def» и «val» для определения функции
Почему это не так: User.getClass.getDeclaredFields.map(_.getName) == List("id", "name")
?
- Перегрузка конструктора Scala?
- Могу ли я получить список времени компиляции всех объектов case, которые происходят из запечатанного родителя в Scala?
- В Scala, что такое «ранний инициализатор»?
- Что такое функция приложения в Scala?
- scala: memoize функция независимо от того, сколько аргументов функция принимает?
- Подчеркивание в List.filter
- Подчеркивание в именованных аргументах
- Скала для странного поведения
Используя 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.