簡體   English   中英

如何從MemberScope反射中找到超類

[英]How to find super class from MemberScope reflection

我正在使用幾種反射方法:

  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)

其中Model是超類。 問題是我似乎只能弄清楚子類typeSignature。 如何根據成員是Model的子類來過濾成員?

有一個非常方便的<:<運算符來測試一個類型是否是另一個的子類型:

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)

它似乎對我有用嗎?

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)
    }
}

發現了一點駭客。 如果有人知道更具體的方式,我很樂意看到。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM