Reflection Scala的反射API

Reflection Scala的反射API,reflection,scala,Reflection,Scala,有人知道Scala全功能反射API的状态吗 我知道您可以使用Java的反射API来做简单的事情,但这与Scala的语言功能不兼容。我发现了一个描述实验性Scala镜像API的示例,但据我所知,这仍然是实验性的。我还发现提到了ScalaSigParser,但这似乎是相当低的级别 这更像是一种好奇,因为我现在只是在玩Scala。我认为这个问题的答案可能对其他对Scala感兴趣的人也很有用。可以用命名参数和@BeanProperty注释来表示“JavaBean样式模式的不可变替换”: import r

有人知道Scala全功能反射API的状态吗

我知道您可以使用Java的反射API来做简单的事情,但这与Scala的语言功能不兼容。我发现了一个描述实验性Scala镜像API的示例,但据我所知,这仍然是实验性的。我还发现提到了ScalaSigParser,但这似乎是相当低的级别

这更像是一种好奇,因为我现在只是在玩Scala。我认为这个问题的答案可能对其他对Scala感兴趣的人也很有用。

可以用命名参数和@BeanProperty注释来表示“JavaBean样式模式的不可变替换”:

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

A(x = "s", y = 3)
A(y = 3, x = "s")
添加方法(更准确地说:定义一个新接口)只有在客户端知道新方法并且可以根据接口进行编译的情况下,在静态类型语言中才有意义。使用结构类型,客户机可以定义他们希望在对象中出现的方法。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
您可以动态地定义新的类或特征。explorate方法将Scala代码转换为字节代码

您已经提到了不太容易使用的


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

你能更具体地说明你想做什么吗?您可以使用scala.tools.nsc中的例程来帮助解决名称混乱的问题,有些事情根本不能很好地反映出来——您确实需要编译来帮助您解决问题,因为它们不仅仅是调用现有方法的问题(例如,如果您需要新的闭包),我在想,创建带有命名参数的类的实例会很好,这样您就不必担心参数的顺序——这可能是JavaBean样式模式的一个不可变的替代品。我也在想,能够看到一个类的结构会很好,因为它与Scala特性有关。把所有的CTOR都给我-找到主要的一个-打电话给它。或者回答诸如这个字段是val还是var之类的问题。另外,最好使用以惯用的Scala风格完成的反射API,而不是使用Java的API。只是想法..我没有想到一些更动态的元编程功能,比如在运行时添加方法或eval风格的语句-只是更符合Java反射API允许您做的事情,但适合Scala语言。我只是在这里发布了关于新反射API的相关信息=>我做了一个关于如何使用新的反射api来发现方法是否是隐式的。有些链接直接指向scala github repo。这在运行时失败是因为强制转换,而不是因为结构类型。