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.basis
和scala.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
的成员,这些成员不是方法。有很多方法可以对其进行微调。