2015-02-11 14 views
7

Làm cách nào tôi có thể tra cứu giá trị của thuộc tính động bằng tên trong Scala 2.10.x?Scala: Cách truy cập thuộc tính lớp theo tên động?

Ví dụ: Với lớp (nó không thể là một lớp trường hợp):

class Row(val click: Boolean, 
      val date: String, 
      val time: String) 

tôi muốn làm một cái gì đó như:

val fields = List("click", "date", "time") 
val row = new Row(click=true, date="2015-01-01", time="12:00:00") 
fields.foreach(f => println(row.getProperty(f))) // how to do this? 
+1

Bạn phải sử dụng sự phản chiếu. http://docs.scala-lang.org/overviews/reflection/overview.html – lmm

+0

bản sao có thể có của [Lặp lại đơn giản trên các trường của trường hợp] [http://stackoverflow.com/questions/23128433/simple-iteration-over- trường hợp lớp-trường) –

+0

bạn có thể kiểm tra câu trả lời của tôi ở đây để đạt được điều này tại thời gian biên dịch vs sử dụng phản ánh thời gian chạy: http://stackoverflow.com/a/28420822/1331769 –

Trả lời

12
class Row(val click: Boolean, 
     val date: String, 
     val time: String) 

val row = new Row(click=true, date="2015-01-01", time="12:00:00") 

row.getClass.getDeclaredFields foreach { f => 
f.setAccessible(true) 
println(f.getName) 
println(f.get(row)) 
} 
+0

Cảm ơn bạn, điều này hoạt động như một sự quyến rũ cho việc sử dụng của tôi- case: _extract dữ liệu từ một cá thể lớp, khi tên thuộc tính đến từ đâu đó khác_ (một cuộc gọi API). Việc gọi '.setAccessible (true)' là cần thiết. – kilogic

0

Bạn cũng có thể sử dụng chức năng đậu từ java/scala:

import scala.beans.BeanProperty 
import java.beans.Introspector 

object BeanEx extends App { 
    case class Stuff(@BeanProperty val i: Int, @BeanProperty val j: String) 
    val info = Introspector.getBeanInfo(classOf[Stuff]) 

    val instance = Stuff(10, "Hello") 
    info.getPropertyDescriptors.map { p => 
    println(p.getReadMethod.invoke(instance)) 
    } 
} 
Các vấn đề liên quan