【发布时间】:2020-06-12 03:17:52
【问题描述】:
使用Java反射,我可以:
MyObject
.getClass
.getMethods
.map(_.getDeclaringClass())
对于在 Object MyObject 中声明的每个方法,我将获得该方法/值的声明类 - 我感兴趣的是,具体来说,告诉 MyObject 是否正在声明这些方法/值与否。
也就是说,我不想使用 Java 反射(因为除其他外,我在此过程中失去了 Scala 功能 - 例如,getMethods 将返回方法和值,因为值的表示方式爪哇)。如何使用 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 直接声明的所有方法,而不是由任何其他模块或类继承。
【问题讨论】:
-
正如我所说,我不想使用 Java 反射,因为它不区分方法和值。我已经通过 Java 反射实现了我想要的 - 只是我需要它不会提供给我的功能,因此搜索 Scala 反射版本。
-
我见过那个。他的问题有点不同——他也面临着 Java 反射性质的问题,但他仍然想要 Java 反射。
-
你见过the owner method吗?
-
见鬼,这就是我需要的!这有点明显,但我没有注意文档的那部分。谢谢!不过,我遇到了一个小问题:打电话给
.owner,我得到一个Symbol。我必须将它与ModuleSymbol进行比较,我真的不知道该怎么做。无论如何,你能把它写下来作为答案,让我接受吗? -
执行
asType会返回TypeSymbol。这就是你想要的吗?
标签: scala reflection scala-reflect