Scala 2.10有哪些反射功能?



Scala 2.10带来了除了JVM(或者我猜是CLR)之外的反射。

我们需要特别期待什么,它将如何在平台上得到改进?

例如,是否会有一个类反映语言的字段和访问方法之间的可转换性,以便我可以遍历对象的属性?

更新2012-07-04 :

Daniel SOBRAL(也在SO上)在他的博客文章"Scala中使用反射的JSON序列化!"Part 1 -所以你想做反射?"反射带来的一些特性:

总结一下,Scala 2.10将提供一个Scala反射库。
该库由编译器本身使用,但是通过饼模式划分为层,因此不同的用户看到不同级别的细节,保持jar大小适合每个人的使用,并希望隐藏不需要的细节。

反射库还集成了即将推出的宏工具,使有进取精神的编码人员能够在编译时操作代码。


更新2012-06-14。 (from Eugene Burmako):
Scala 2.10.0-M4中,我们已经发布了新的反射API,它很可能会在2.10.0-final中出现,而不会发生重大变化。关于API的更多细节可以在

找到:
  • SO answer使用新的Scala反射API获取伴侣对象实例
  • Scala Reflection SIP, 2012年6月,作者Martin Odersky (SIP,实际上是"Scala改进过程")
  • 摘要和M3
  • 迁移路线

提取:

宇宙和镜像现在是独立的实体:

  • 宇宙承载反射工件(树、符号、类型等),
  • 反映了这些工件的抽象加载(例如JavaMirror加载的东西)使用类加载器和注释解压器,而GlobalMirror使用内部编译器classreader来实现相同的目标)。

公共反射API分为 scala.reflect.base scala.reflect.api

  • 前者代表了一个极简主义的快照,正好足以构建具体化的树和类型。
  • 构建,而不是分析-一切智能(例如,获取类型签名)在scala.reflect.api中实现。

两个反射域都有自己的域:scala.reflect.basisscala.reflect.runtime.universe

  • 前者是超轻量级的,不涉及任何类加载器,

初稿,2011年9月:

你可以在Scala GitHub repo中看到反射包的演变,有这两个最近的提交:

  • 修改Liftcode,使用新的反射语义,其中编译器使用类型检查。
  • 开始编译可以在运行时编译反射树的编译器工具箱。

(Liftcode,根据这个线程,旨在简化"写代码的代码")

scala/reflect/internal/Importers.scala(昨天创建的!)是使用最新反射特性的一个很好的例子。

您应该感兴趣的两个链接:

  • 关于反射api的scala-internal邮件列表讨论。
  • 2.10-SNAPSHOT的夜间构建api文档。

就我个人而言,我希望用它来做扩展的运行时发现(即一种扩展已知特性的类型),并从这些生成UI表单和其他一些东西。

使用当前的2.10M4,您已经可以遍历类的成员:

reflect.runtime.universe.typeOf[MyClass].members.filter(!_.isMethod)

上面的代码列出了Symbol对象,表示类MyClass的成员,这些成员不是方法。有很多方法可以对其进行微调。

相关内容

  • 没有找到相关文章

最新更新