Scala的Reflection API

Tra*_*ger 12 reflection scala

有谁知道Scala的全功能反射API的状态?

我知道您可以使用Java的反射API来做简单的事情,但这对Scala的语言功能不起作用.我发现了一篇描述实验性Scala Mirroring API 的有趣文章,但据我所知,这仍然是实验性的.我也发现了一个ScalaSigParser,但这似乎是相当低的水平.

这更像是一种好奇心,因为我目前正在玩Scala.我认为这个问题的答案对于对Scala感兴趣的其他人也可能有用.

Tho*_*ung 6

"JavaBean样式模式的不可替换替换"可以表示为命名参数,也可以表示@BeanProperty批注:

import reflect._
case class A(@BeanProperty val x: String, @BeanProperty val y : Int)

A(x = "s", y = 3)
A(y = 3, x = "s")
Run Code Online (Sandbox Code Playgroud)

如果客户端知道新方法并且可以针对接口进行编译,则添加方法(更精确:定义新接口)仅在静态类型语言中有意义.通过结构化键入,客户端可以定义他们希望在对象中出现的方法.Scala编译器会将结构类型转换为可能在运行时失败的反射代码.

type T = {def go(x : Int): Int }
def y(any : Any) = any.asInstanceOf[T].go(2)

class A{
  def go(x : Int) = x + 1
}
y(new A())
y(new {}) //this will fail
Run Code Online (Sandbox Code Playgroud)

您可以使用解释器动态定义新的类或特征.Interpret方法将Scala代码转换为字节代码.

您已经提到了ScalaSigParser,它并不容易使用.

我认为你喜欢的其他功能还没有.