4

跟进这个问题,我试图弄清楚如何在对象上调用方法。相关定义如下:

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

我有一个这样Symbol的:objA

import reflect.runtime.universe._

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

这会返回一个Iterable带有单个元素的 a,所以让我们说:

val objASymbol = stuff.head.asModuleSymbol

然后我尝试,基于this other question,这个:

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

这导致了该主题引用的错误消息:

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)

问题是我无法弄清楚这条错误消息告诉我该怎么做!

4

1 回答 1

7

你需要写runtimeMirror.reflect(<instance of MyClass>).reflectModule(objASymbol)。普通的 reflectModule 不行,因为一些反射操作objA(例如获取它的实例)需要一个外部实例。

不幸的是,即使你写对了,你的用例也不会起作用,因为 M4 只支持静态对象:https ://issues.scala-lang.org/browse/SI-5498 。我们将在 2.10.0-final 之前实现这一点。

于 2012-06-18T15:29:55.800 回答