我正在尝试使用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实例作为参数,因此我无法遵循异常消息中的建议。
答案 0 :(得分:1)
有没有办法绕过它?
是的,错误信息清楚地说明了它是什么:
在InstanceMirror上使用reflectClass来获取其ClassMirror
即。而不是mirror.reflectClass(classSymbol)
调用mirror.reflect(labelBar).reflectClass(classSymbol)
(假设您希望为嵌套在ClassMirror
中的类获取labelBar
。要查找该实例,您可以尝试将typeTag.tpe
与TypeRef
匹配。