我们可以从Scala 2.10获得哪些反射功能?

Dun*_*gor 31 reflection scala

Scala 2.10带来了除了提供JVM(或者我猜CLR)之外的反射.

我们还有什么特别值得期待的,它将如何在平台上得到改善?

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

Von*_*onC 14

更新2012-07-04:

Daniel SOBRAL(也在SO上)详细介绍了他的博客文章" Scala中带有反射的JSON序列化!第1部分 - 所以你想做反思吗? "一些反映的功能:

概括来说,Scala 2.10将附带一个Scala反射库.
该库由编译器本身使用,但通过蛋糕模式分为多个层,因此不同的用户可以看到不同级别的细节,保持jar大小足以满足每个人的使用需求,并希望隐藏不需要的细节.

反射库还集成了即将推出的宏设施,使有进取心的编码人员能够在编译时操作代码.


更新2012-06-14.(来自Eugene Burmako):
Scala 2.10.0-M4中,我们发布了新的反射API,它最有可能在没有重大变化的情况下进入2.10.0-final.
可以找到有关API的更多详细信息:

摘录:

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

  • Universes主持反射工件(树,符号,类型等),
  • 镜像抽象加载那些工件(例如JavaMirror使用类加载器和注释unpickler加载东西,而GlobalMirror使用内部编译器classreader来实现相同的目标).

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

  • 前者表示一个简约的快照,足以构建具体化的树和类型.
  • 要构建,而不是分析 - 实现智能的一切(例如,获取类型签名)scala.reflect.api.

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

  • 前者超轻量级,不涉及任何类加载器,
  • 而后者代表一个精简的编译器.

最初的答案,2011年9月:

您可以在Scala GitHub存储库中看到反射包的演变,这两个最近的提交:

(根据这个帖子,Liftcode 旨在简化"编写代码编写代码")

该类scala/reflect/internal/Importers.scala(昨天创建!)是使用这些最新反射功能的一个很好的例子.


Bri*_*ith 11

应该感兴趣的两个链接:

我个人希望使用它来进行扩展的运行时发现(即扩展已知特征的类型),并从那些生成UI表单和其他一些东西.


Nik*_*kov 5

使用当前的2.10M4,您已经可以迭代一个类的成员:

reflect.runtime.universe.typeOf[MyClass].members.filter(!_.isMethod)
Run Code Online (Sandbox Code Playgroud)

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