2009-10-19 15 views
17

alan adından yansıtıcı bir alan değeri ayarlayın: eğer öyleyse, ben skala nesneler arasında bir mapper yapıyorumScala: Ben scala öğreniyorum ve bunun nasıl bulamıyor

ve appengine varlıkları google i böyle bir sınıf var:

ben java ben en adıyla alanı almak ve sonra field.set(object, value) yapmak ama scala içinde bunu nasıl bulamıyor olur, bu sınıfın bir örneğini oluşturmak gerekir.

Öğrenci alanları özel olarak görüldüğünden ve field.set bu nedenle bir hata attığından java yansımasını kullanamıyorum.

Teşekkür

cevap

36

Scala özel alana "var" döner bir alıcı ve bir ayarlayıcı. Yani bir String kullanarak tanımlayarak bir var/almak için, getter/setter yöntemlerini bulmak için Java yansımasını kullanmanız gerekir. Aşağıda, bunu yapan bir kod pasajı var. Lütfen bu kodun Scala 2.8.0 altında çalıştığını ve çoğaltılan yöntem adlarının ve hatalarının ele alınmadığını unutmayın.

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

Teşekkürler! Bu gerçekten yardımcı oldu, kodunuzun bir kısmını aldım ve Scala 2.7.6'da çalışıyordum – Damian

+0

Ayrıca, yöntem parametre türlerini önceden biliyorsanız, getClass.getDeclaredMethod komutunu kullanırsanız, yöntemi doğrudan isimle getirebilirsiniz! –

+0

Neden field.setAccessible (true) ayarından daha iyidir? – Yael