2009-10-19 42 views
17

Tôi đang học scala và không thể tìm hiểu cách thực hiện việc này:Scala: đặt giá trị trường phản ánh từ tên trường

Tôi đang làm người lập bản đồ giữa các đối tượng scala và thực thể appengine google, vì vậy nếu tôi có một lớp học như thế này:

tôi cần phải tạo một thể hiện của lớp đó, trong java tôi sẽ có được lĩnh vực theo tên của nó và sau đó làm field.set(object, value) nhưng tôi không thể tìm thấy làm thế nào để làm như vậy trong scala.

Tôi không thể sử dụng phản chiếu java vì các trường của Sinh viên được xem là riêng tư và field.set ném lỗi vì lý do đó.

Cảm ơn

Trả lời

36

Scala biến "var" thành trường riêng, một bộ nạp và một bộ đặt. Vì vậy, để có được/thiết lập một var bằng cách xác định nó bằng cách sử dụng một String, bạn cần phải sử dụng Java phản ánh để tìm các phương thức getter/setter. Dưới đây là đoạn mã thực hiện điều đó. Xin lưu ý mã này chạy dưới Scala 2.8.0 và handlings của tên phương thức trùng lặp và lỗi là không tồn tại.

class Student { 
    var id: Long = _ 
    var name: String = _ 
} 

implicit def reflector(ref: AnyRef) = new { 
    def getV(name: String): Any = ref.getClass.getMethods.find(_.getName == name).get.invoke(ref) 
    def setV(name: String, value: Any): Unit = ref.getClass.getMethods.find(_.getName == name + "_$eq").get.invoke(ref, value.asInstanceOf[AnyRef]) 
} 

val s = new Student 
s.setV("name", "Walter") 
println(s.getV("name")) // prints "Walter" 
s.setV("id", 1234) 
println(s.getV("id")) // prints "1234" 
+0

Cảm ơn! điều đó thực sự hữu ích, tôi lấy một phần mã của bạn và làm việc tốt trong Scala 2.7.6 – Damian

+0

Bạn cũng có thể lấy trực tiếp phương thức theo tên nếu bạn sử dụng getClass.getDeclaredMethod nếu bạn biết trước các kiểu tham số phương thức! –

+0

Tại sao nó tốt hơn thiết lập field.setAccessible (true)? – Yael

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