从案例类中获取字段名称列表 [英] Get field names list from case class

查看:46
本文介绍了从案例类中获取字段名称列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我只需要获取案例类的字段名称.我对它的价值不感兴趣.我以为 getClass.getDeclaredFields.map(_.getName) 会返回一个字段名称列表.

I need to get only field names of case class. I'm not interested in its values. I thought getClass.getDeclaredFields.map(_.getName) would return a list of field names.

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)

这个 User$.MODULE$ 是什么?那是什么?

What is this User$.MODULE$? What's that?

当您有一个 case 类的实例时,方法 getDeclaredFields 工作正常,但我不想创建一个实例来仅获取字段.

Method getDeclaredFields works fine when you have an instance of a case class, but I don't want to create an instance in order to get only fields.

为什么这不是真的:User.getClass.getDeclaredFields.map(_.getName) == List("id", "name")?

推荐答案

通过使用 User.getClass,您指的是 Scala 默认为 case 类创建的类伴侣对象,而不是案例类本身.获取案例类的类对象,使用classOf[User].

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].

或者,您可以使用 Scala 的反射 API 来获取案例类的元数据,这将为您提供更多信息:

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

在 sbt 控制台中测试:

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)

这篇关于从案例类中获取字段名称列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆