簡體   English   中英

如何使用 Scala 反射獲取聲明 class / trait?

[英]How to get the declaring class / trait using Scala reflection?

使用 Java 反射,我可以:

MyObject
  .getClass
  .getMethods
  .map(_.getDeclaringClass())

對於 Object MyObject中聲明的每個方法,我將獲得該方法/值的聲明 class - 我在這里感興趣的是,具體而言,告訴我這些方法/值是否由MyObject聲明。

也就是說,我不想使用 Java 反射(因為除其他外,我在此過程中丟失了 Scala 功能 - 例如, getMethods將返回方法和值,因為值在 Java 中表示的方式)。 我怎樣才能用 Scala 反射達到同樣的效果? 這是我到目前為止所得到的:

val ru = scala.reflect.runtime.universe
val currentMirror = scala.reflect.runtime.currentMirror
val instanceMirror = currentMirror.reflect(MyObject)
val moduleSymbol = currentMirror.moduleSymbol(MyObject.getClass)

val methodSymbols =  moduleSymbol
  .info
  .members
  .map(_.asMethod)

methodSymbols
  .map(_.getDeclaringClassInScala) // ???????

當然,最后一行是行不通的。 我試圖瀏覽文檔,但無濟於事。 任何幫助表示贊賞。

編輯:澄清一下,為了幫助更多人,問題是以更通用的方式編寫的。 特別是我的用例是過濾所有由MyObject直接聲明的方法,而不是由任何其他模塊或 class 繼承的方法。

所有者方法應該在這里為您提供幫助。 它將返回封閉的 class。

methodSymbols.map(_.owner.asType)

斯卡斯蒂的例子

特別是我的用例是過濾所有由MyObject直接聲明的方法,而不是由任何其他模塊或 class 繼承的方法。

那么使用.decls而不是.members就足夠了

trait MyTrait1 {
  def bar(): Unit = println("bar")
}
trait MyClass {
  def baz(): Unit = println("baz")
}

object MyObject extends MyClass with MyTrait1 {
  def foo(): Unit = println("foo")
}

typeOf[MyObject.type].members.filter(_.isMethod).toList
// List(method foo, constructor MyObject, method bar, method $init$, method baz, method synchronized, method ##, method !=, method ==, method ne, method eq, method notifyAll, method notify, method clone, method getClass, method hashCode, method toString, method equals, method wait, method wait, method wait, method finalize, method asInstanceOf, method isInstanceOf)
typeOf[MyObject.type].decls.filter(_.isMethod).toList
// List(constructor MyObject, method foo)

所以我想methodSymbols.map(_.owner.asClass).filter(_ == currentMirror.symbolOf(MyObject)) (我猜你的意思是symbolOf[MyObject.type] )。

MyObject不能從其他模塊(對象)繼承方法,只能從類(特征)繼承。

暫無
暫無

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

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