【发布时间】:2018-08-02 15:19:56
【问题描述】:
我正在尝试在实例中获取反射的运行时方法,但它未显示在 decls 结果中:
val foo: AnyRef = new Object {
def bar = 1
}
typeOf[foo.type].decls //Does not contain bar method
我尝试使用 Java 反射类并且它可以工作:
foo.getClass.getDeclaredMethods //It contains bar method
但我更喜欢使用 MethodSymbols 和 Scala 类型而不是 Java 类和方法反射。如何获取反射的 MethodSymbol?
我想要一个方法来查找作为 AnyRef 传递给方法栏的对象并调用它。如下所示:
def getBarMethodFromObj(obj: AnyRef): MethodSymbol = {
//typeOf(obj).decl(TermName("bar")) this doesn't work
}
我不能使用 trait,因为 bar 可以有不同的参数并返回类型和数字。由于 Scala 不支持可变泛型参数,我计划使用反射来查找方法和调用,但这在 Scala 中也无法完成。我目前正在使用Java解决方案:
val bar = foo.getClass.getDeclaredMethods.find(_.getName == "bar")
bar.invoke(foo, params: _*)
但是 Java 反射不保留泛型类型,因为它会给 List 和 Map 等带来问题。所以我想知道我是否可以在 Scala 中实现它,或者是否有任何即将到来的解决方案
【问题讨论】:
-
请注意
foo.bar也不编译。值foo的类型为foo.type,是AnyRef的子类型,而AnyRef没有方法bar。typeOf[foo.type]gizmo 只包含在编译时可以推断的信息,而在编译时,从编译器的角度来看,没有任何东西表明foo有一个方法bar。 -
@AndreyTyukin 感谢您的评论。我改成运行时反射方法
-
TypeTags 对于大多数用例来说已经足够了,我想,但你的用例是什么?
标签: scala reflection