Scala.

2015-07-02 33 views
25

durum sınıfından alan isimleri listesi al Yalnızca vaka sınıfının alan adlarını almam gerekiyor, değerleriyle ilgilenmiyorum. Sorun olmadığını düşündüm ve getClass.getDeclaredFields.map (_. GetName) bana alan adlarının bir listesini döndürürdü. Ve benzer bir soru bulamıyorum.Scala.

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) 

Bu kullanıcı $ .MODULE $ nedir? Bu da ne? Eğer durum sınıfının örneğini aldığımda

Yöntem getDeclaredFields çalışıyor, ama sadece alanları

bu doğru değildir Neden

almak için bir örneğini oluşturmak istemiyoruz? User.getClass.getDeclaredFields (_. GetName) == listesi ("id", "ad")

cevap

45

User.getClass'u kullanarak, Scala'nın varsayılan olarak sınıf sınıfı için değil sınıfın kendisi için oluşturduğu sınıf tamamlayıcı nesnesine başvurursunuz. Vaka sınıfının sınıf nesnesini almak için classOf[User] kullanın. sbt konsolunda

import scala.reflect.runtime.universe._ 

def classAccessors[T: TypeTag]: List[MethodSymbol] = typeOf[T].members.collect { 
    case m: MethodSymbol if m.isCaseAccessor => m 
}.toList 

Testi:

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) 
+2

Gelip görünen

Alternatif olarak, size çok daha fazla bilgi verir bir vaka sınıfının meta almak için Scala'nın yansıma API kullanabilirsiniz lexo düzeninde geri. Kodda bildirildikleri sırada geri gelmelerini sağlamak için herhangi bir yolu var mı? – samthebest

+1

Bu yanıtın, siparişi nasıl alacağınızı açıklayan bir iş parçacığı vardır: http://stackoverflow.com/a/16079804/1586965 – samthebest

10

User.getClass size Java User.class eşdeğer vermez, ama size eşlik sınıfını verir User sınıfının nesnesi. User'un Class nesnesini ile alabilirsiniz.

düzenleme: Oh ve User$.MODULE$, dahili olarak kullanılan tekil durumun bir erişimcisidir. Java'da singleton yazarken bunu MyClass.INSTANCE'a eşdeğer olarak düşünün.