【发布时间】:2016-03-04 16:24:19
【问题描述】:
我想通过反射从类实例中获取所有字段。对于普通类来说一切正常(例如仅过滤器):
scala> import scala.reflect.runtime.universe._
scala> import scala.reflect.runtime.currentMirror
scala> class A {val a = 1}
scala> currentMirror.classSymbol((newA).getClass).toType.members.filter(_.name.toString == "a")
res12: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(value a)
但是对于匿名类我有不同的情况:
scala> trait B {val b = 2}
scala> currentMirror.classSymbol((new B {}).getClass).toType.members.filter(_.name.toString == "b")
res13: Iterable[reflect.runtime.universe.Symbol] = SynchronizedOps(method b, value b)
这个值不是公开的,但是方法是公开的。有人可以解释一下,这里发生了什么吗?为什么在匿名课程的情况下我没有简单的公共value b?统一成员处理有什么解决方法吗?
编辑
实际上,我最初的任务是从任何实例中获取所有公共字段。如果是普通类,我使用以下代码:
val reflectedInstance = currentMirror.reflect(instance)
for {
member ← reflectedInstance.symbol.toType.members
if member.isPublic && (!member.isMethod || member.asMethod.isGetter)
} yield //do something
上面的示例描述了为什么此代码在匿名类的情况下不起作用。所以,现在我正在寻找某种方法,如何从普通类和匿名类中获取所有公共字段。
【问题讨论】:
标签: scala reflection anonymous-class