如何从MemberScope反射中找到超类

时间:2013-11-04 19:58:11

标签: scala reflection scala-2.10

我正在使用一些反射方法:

  def typeMirror = runtimeMirror(this.getClass.getClassLoader)
  def instanceMirror = typeMirror.reflect(this)
  def members = instanceMirror.symbol.typeSignature.members

我想尝试做这样的事情(我明白这是不正确的,但我尝试了各种方法但没有成功):

  def modelMembers = members.filter(member => member.typeSignature == Model)

模特是超级的。问题是我似乎只能弄清楚子类的typeSignature。如何根据成员是否为模型的子类来过滤成员?

3 个答案:

答案 0 :(得分:1)

有一个非常方便的<:<运算符来测试某个类型是否是另一个类型的子类型:

def modelMembers = members.filter(_.typeSignature <:< typeOf[Model])

注意:这只会为您提供字段,而不是Model返回类型的方法。

示例:

trait A
class B extends A
class C extends A

class X {
  val hello: C = null
  var world: B = null
}

scala> import reflect.runtime.universe._
import reflect.runtime.universe._

scala> typeOf[X].members.filter(_.typeSignature <:< typeOf[A])
res0: Iterable[Symbol] = SynchronizedOps(variable world, value hello)

答案 1 :(得分:0)

它似乎对我有用吗?

package load.data

abstract class AbstractPoint
case class Point() extends AbstractPoint

object ModelTest {
  def main(arg: Array[String]) =
    {
      val li = List(new Point())
      assert(li.filter(_.isInstanceOf[AbstractPoint]).length == 1)
    }
}

答案 2 :(得分:0)

发现了一点点黑客攻击。如果有人知道更具体的方式,我很乐意看到它。

  def modelMembers = {
    val filtered = members.filter(member => member.typeSignature.baseClasses.size > 0 && member.isTerm && !member.isMethod)
    filtered.filter(_.typeSignature.baseClasses.exists(_.name.toString == "Model"))
  }