Scala是否具有类似于Python的dir()的内省能力?

时间:2009-12-29 06:21:00

标签: scala introspection

是的,我知道非Python教徒认为它很懒惰。我问的原因是许多Scala库中仍然缺少文档(例如Scala-dbc,但这并不是我所看到的),如果我能在运行时看到对象/类的属性,我可以在至少弄明白什么是可用的。感谢。

4 个答案:

答案 0 :(得分:11)

Scala没有反射API。访问此信息的唯一方法是使用Java reflection API。这样做的缺点是结构可能会随着Scala在Java类中的表示方式而改变,并且接口将来可能会发生变化。

scala> classOf[AnyRef].getMethods
res0: Array[java.lang.reflect.Method] = Array(public final void ...

可以使用ScalaSigParser访问字节代码中的某些特定类型信息。

import tools.scalap.scalax.rules.scalasig._
import scala.runtime._

val scalaSig = ScalaSigParser.parse(classOf[RichDouble])

答案 1 :(得分:10)

这是我对REPL的主要用途之一。键入对象的名称,点,然后键入TAB,它将显示所有可用的方法。

这不完美。首先,它显示了受保护的方法,除非您正在扩展该类,否则将无法使用这些方法。另一方面,它没有通过隐式转换显示可用的方法。

当然,IDE都能够做到这一点。

答案 2 :(得分:6)

您可能需要以下内容,以满足您的需求。在这种情况下,它显然是在String上运行。

val testStr = "Panda"
testStr.getClass.getMethods.foreach(println)

这有用吗?

答案 3 :(得分:0)

您可能希望使用this小帮手来加强REPL