4 votes

Scala reflection erreur: ceci est un module interne, utilisez reflectModule sur un InstanceMirror pour obtenir son ModuleMirror

Après avoir suivi cette question, j'essaie de comprendre comment appeler une méthode sur un objet. Les définitions pertinentes sont :

trait ThirdParty { def invoke = println("right") }
trait WeatherIcon { def invoke = println("wrong") }
class MyClass {
    object objA extends ThirdParty
    object objB extends WeatherIcon
}

J'ai obtenu un Symbol pour objA de cette manière :

import reflect.runtime.universe._

val stuff = typeOf[MyClass].members.filter(_.isValue).filter(_.typeSignature <:< typeOf[ThirdParty])

Cela renvoie un Iterable avec un seul élément, disons :

val objASymbol = stuff.head.asModuleSymbol

J'ai ensuite essayé, sur la base de cette autre question, ceci :

val mirror = runtimeMirror(getClass.getClassLoader)
mirror.reflectModule(objASymbol)

Ce qui a entraîné le message d'erreur cité dans le sujet :

java.lang.Error: this is an inner module, use reflectModule on an InstanceMirror to obtain its ModuleMirror
    at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectModule(JavaMirrors.scala:118)
    at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectModule(JavaMirrors.scala:60)

Le problème est que je ne parviens pas à comprendre ce que ce message d'erreur me dit de faire!

7voto

Eugene Burmako Points 8453

Vous devez écrire runtimeMirror.reflect().reflectModule(objASymbol). Plain reflectModule ne suffira pas, car certaines opérations réflexives sur objA (par exemple obtenir son instance) nécessitent une instance extérieure.

Malheureusement, votre cas d'utilisation ne fonctionnera même si vous l'écrivez correctement, car M4 ne prend en charge que les objets statiques: https://issues.scala-lang.org/browse/SI-5498. Nous implémenterons ceci avant 2.10.0-final.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X