2015-02-11 22 views
7

Nesnenin özelliğinin değerini Scala 2.10.x'deki adıyla dinamik olarak nasıl arayabilirim?Scala: Bir sınıf özelliğine dinamik olarak ada göre nasıl erişilir?

E.g.

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

ben böyle bir şey yapmak istiyorum: Verilen sınıf (bir vaka sınıfı olamaz)

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

Yansıma kullanmak zorundasınız. http://docs.scala-lang.org/overviews/reflection/overview.html – lmm

+0

[vaka sınıf alanları üzerinden Basit Yineleme] 'nin olası kopyası (http://stackoverflow.com/questions/23128433/simple-iteration-over- vaka-sınıf-alanları) –

+0

Eğer çalışma zamanı yansıması kullanarak derleme zamanında bunu elde etmek için burada cevap kontrol edebilirsiniz: http://stackoverflow.com/a/28420822/1331769 –

cevap

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

Teşekkür ederim, bu benim kullanım için bir çekicilik gibi çalışır. case: bir sınıf örneğinden, özellik adı başka bir yerden (API çağrısı) geldiğinde verileri çıkarır. '.setAccessible (true)' çağırmak gerekliydi. – kilogic

0

Ayrıca java/scala gelen fasulye işlevselliği kullanabilirsiniz:

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)) 
    } 
} 
İlgili konular