如何使用 Scala 反射获取声明 class / trait?
How to get the declaring class / trait using Scala reflection?
使用Java反射,我可以:
MyObject
.getClass
.getMethods
.map(_.getDeclaringClass())
对于对象 MyObject
中声明的每个方法,我将获得该方法/值的声明 class - 我在这里特别感兴趣的是,告诉这些方法/值是否由 MyObject
声明。
就是说,我不想使用 Java 反射(因为除其他外,我在这个过程中失去了 Scala 特性——例如,getMethods
将 return方法和值,因为值在 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.
继承的方法
使用Java反射,我可以:
MyObject
.getClass
.getMethods
.map(_.getDeclaringClass())
对于对象 MyObject
中声明的每个方法,我将获得该方法/值的声明 class - 我在这里特别感兴趣的是,告诉这些方法/值是否由 MyObject
声明。
就是说,我不想使用 Java 反射(因为除其他外,我在这个过程中失去了 Scala 特性——例如,getMethods
将 return方法和值,因为值在 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.