2009-10-19 9 views
17

J'apprends scala et ne peut pas savoir comment faire:Scala: définir une valeur de champ pensivement du nom du champ

Je fais un mappeur entre les objets scala et google entités AppEngine, donc si i une classe comme ceci:

Je dois créer une instance de cette classe, en java je recevrais le terrain par son nom, puis faire field.set(object, value) mais je ne peux pas trouver comment le faire dans scala.

Je ne peux pas utiliser la réflexion java car les champs de Student sont considérés comme privés et field.set renvoie une erreur à cause de cela.

Merci

Répondre

36

Scala se "var" dans un champ privé, un getter et un setter. Donc, pour obtenir/définir un var en l'identifiant en utilisant un String, vous devez utiliser la réflexion Java pour trouver les méthodes getter/setter. Voici un extrait de code qui fait cela. Veuillez noter que ce code s'exécute sous Scala 2.8.0 et que les manipulations des noms de méthodes dupliqués et des erreurs sont inexistantes.

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

Merci! c'était vraiment utile, j'ai pris une partie de votre code et j'ai bien travaillé dans Scala 2.7.6 – Damian

+0

Vous pouvez également récupérer directement la méthode par son nom si vous utilisez getClass.getDeclaredMethod si vous connaissez à l'avance les types de paramètres de la méthode! –

+0

Pourquoi est-il préférable de définir field.setAccessible (true)? – Yael

Questions connexes