我可以使用内部类类型的反射来获取外部类的实例吗?

时间:2016-04-18 16:53:44

标签: scala reflection

我正在尝试使用scala反射来实现这一目标:

val labelBar = Named("bar")
val labelFoo = NamedFunc("foo", (i: Int) => println(i))

val i = newInstance[
    labelBar.Var[Int] +
    labelFoo.Func[Int => Unit]
  ]

i.foo(2)
i.bar = 20

它使用newInstace方法创建具有指定成员的新对象。为了允许动态成员,我使用scala的Dynamic类 newInstance采用隐式TypeTag参数。 Var是Named类的内部类:

case class Named(name: String) {
  outer =>
  class Var[T]() {
    def getOuter: Named = outer
  }
}

class +[A, B]

我的问题是我不能在表示内部类的Type上使用reflectClass。它抛出了这个:

scala.ScalaReflectionException: class asVar is an inner class, use reflectClass on an InstanceMirror to obtain its ClassMirror
at scala.reflect.runtime.JavaMirrors$JavaMirror.scala$reflect$runtime$JavaMirrors$JavaMirror$$abort(JavaMirrors.scala:115)
at scala.reflect.runtime.JavaMirrors$JavaMirror.ErrorInnerClass(JavaMirrors.scala:117)
at scala.reflect.runtime.JavaMirrors$JavaMirror.reflectClass(JavaMirrors.scala:183)

有没有办法绕过它? Scala甚至持有这个实例吗?

编辑1: newInstance方法不将labelFoo实例作为参数,因此我无法遵循异常消息中的建议。

1 个答案:

答案 0 :(得分:1)

  

有没有办法绕过它?

是的,错误信息清楚地说明了它是什么:

  

在InstanceMirror上使用reflectClass来获取其ClassMirror

即。而不是mirror.reflectClass(classSymbol)调用mirror.reflect(labelBar).reflectClass(classSymbol)(假设您希望为嵌套在ClassMirror中的类获取labelBar。要查找该实例,您可以尝试将typeTag.tpeTypeRef匹配。