![](/img/trans.png)
[英]Scala accessing members of runtime types using reflection of a class that extends a 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 繼承的方法。
特別是我的用例是過濾所有由
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.