Obtenir la liste des noms de champs de la classe de cas de
J'ai besoin d'obtenir uniquement les noms de champs de la classe de cas. Je ne suis pas intéressé dans ses valeurs.
J'ai pensé getClass.getDeclaredFields.map(_.getName)
doit retourner une liste de noms de champs.
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)
Qu'est-ce que cet Utilisateur$.MODULE de$? Qu'est-ce que?
Méthode getDeclaredFields fonctionne bien lorsque vous avez une instance d'une classe de cas, mais je ne veux pas créer une instance afin d'obtenir uniquement les champs.
Pourquoi ce n'est pas vrai:
User.getClass.getDeclaredFields.map(_.getName) == List("id", "name")
?
Vous devez vous connecter pour publier un commentaire.
En utilisant
User.getClass
, vous faites référence à la classe compagnon objet que la Scala crée par défaut pour le cas de la classe, et pas le cas de la classe elle-même. Pour obtenir l'objet de classe de la classe de cas, l'utilisationclassOf[User]
.Sinon, vous pouvez utiliser Scala, à la réflexion de l'API pour accéder aux métadonnées d'une classe de cas, qui vous donne beaucoup plus d'informations:
Test dans sbt console:
De départ
Scala 2.13
,case classes
(qui sont une mise en œuvre deProduit
) sont maintenant fournis avec un productElementNames méthode qui renvoie un itérateur sur leur champ de noms.À partir d'une instance de la classe de cas (disons
case class Person(name: String, age: Int)
), on peut récupérer unList
de ses champs:User.getClass
ne vous donne pas l'équivalent deUser.class
en Java, mais il vous donne la classe de la compagne de l'objet de laUser
classe. Vous pouvez récupérer leClass
objet deUser
avecclassOf[User]
.modifier: Oh, et le
User$.MODULE$
est un accesseur de l'instance du singleton qui est utilisé en interne. Il pense que l'équivalent deMyClass.INSTANCE
lorsque vous écrivez des singletons en Java.Si vous aussi vous vous demandez pourquoi certains Scala-code de réflexion n'est pas de la compilation de plus, ici, c'est un brut de la solution avec le bon vieux réflexion Java (qui, apparemment, a été travailler exactement de la même manière depuis env. l'année 1300 avant jc):
Il va obtenir à la fois les noms et les valeurs:
L'ordre semble être le même que dans le constructeur.