如何使用 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.

继承的方法

owner 方法应该能帮到您。它将 return 封闭 class.

methodSymbols.map(_.owner.asType)

Scastie

中的例子