2015-07-02 18 views
25

Tôi chỉ cần lấy tên trường của lớp chữ, tôi không quan tâm đến giá trị của nó. Tôi nghĩ rằng đó không phải là vấn đề và getClass.getDeclaredFields.map (_. GetName) sẽ trả lại cho tôi một danh sách tên trường. Và tôi không thể tìm thấy câu hỏi tương tự.Scala. Lấy danh sách tên trường từ trường hợp lớp

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) 

Người dùng này $ .MODULE $ là gì? Cái gì thế?

Phương pháp getDeclaredFields hoạt động tốt khi bạn có thể hiện của trường hợp lớp, nhưng tôi không muốn tạo ra một thể hiện để có được chỉ lĩnh vực

Tại sao điều này là không đúng? User.getClass.getDeclaredFields (_. GetName) Danh sách == ("id", "tên")

Trả lời

45

Bằng cách sử dụng User.getClass, bạn đang tham chiếu đến đối tượng đồng hành lớp mà Scala theo mặc định sẽ tạo cho lớp chữ hoa và không phải là lớp chữ hoa. Để lấy đối tượng lớp của lớp chữ hoa, hãy sử dụng classOf[User].

Ngoài ra, bạn có thể sử dụng phản ánh API Scala của để có được những siêu dữ liệu của một lớp trường hợp, mang đến cho bạn nhiều thông tin hơn:

import scala.reflect.runtime.universe._ 

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

thử nghiệm trong 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) 
+2

Chúng xuất hiện đến trở lại theo thứ tự lexo. Có cách nào để khiến họ trở lại theo thứ tự mà họ được khai báo trong mã không? – samthebest

+1

Câu trả lời này có một chuỗi giải thích cách nhận theo thứ tự: http://stackoverflow.com/a/16079804/1586965 – samthebest

10

User.getClass không cung cấp cho bạn tương đương với User.class trong Java, nhưng nó mang lại cho bạn lớp của người bạn đồng hành đối tượng của lớp User. Bạn có thể truy xuất đối tượng Class của User với classOf[User].

chỉnh sửa: Oh và User$.MODULE$ là một trình truy cập vào cá thể singleton được sử dụng trong nội bộ. Hãy suy nghĩ về nó như là tương đương với MyClass.INSTANCE khi bạn đang viết đơn trong Java.

Các vấn đề liên quan