2015-02-11 14 views
7

Come posso cercare dinamicamente il valore della proprietà di un oggetto per nome in Scala 2.10.x?Scala: Come accedere a una proprietà di classe dinamicamente per nome?

E.g. Data la classe (che non può essere una classe caso):

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

voglio fare qualcosa di simile:

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

È necessario utilizzare la riflessione. http://docs.scala-lang.org/overviews/reflection/overview.html – lmm

+0

possibile duplicato di [Iterazione semplice sui campi della classe case] (http://stackoverflow.com/questions/23128433/simple-iteration-over- case-class-fields) –

+0

è possibile controllare la mia risposta qui per ottenere questo in fase di compilazione vs utilizzando il riflesso di runtime: http://stackoverflow.com/a/28420822/1331769 –

risposta

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

Grazie, questo funziona come un fascino per il mio uso- caso: _ estrarre i dati da un'istanza di classe, quando il nome della proprietà proviene da qualche altra parte_ (una chiamata API). Era necessario chiamare '.setAccessible (true)'. – kilogic

0

È anche possibile utilizzare la funzionalità di fagioli da 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)) 
    } 
} 
Problemi correlati