【问题标题】:What reflection capabilities can we expect from Scala 2.10?我们可以从 Scala 2.10 中获得哪些反射功能?
【发布时间】:2011-09-19 21:02:05
【问题描述】:

Scala 2.10 带来了不同于提供 JVM(或者我猜是 CLR)的反射。

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

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

【问题讨论】:

  • 嘿,我真的想要例子——现在有赏金了!
  • 好吧,仍然没有真正的例子,这个问题现在是谷歌对Scala reflection 2.10 Ho hum 的热门话题,我想@VonC 有,但如果有人能告诉我用户级代码,我会仍然感激不尽。
  • 邓肯,谢谢!请参阅stackoverflow.com/questions/7708485/scala-class-getfields/… 事实证明,使用当前的 2.10.0-SNAPSHOT 您已经可以迭代类的属性。

标签: scala reflection


【解决方案1】:

2012-07-04 更新:

Daniel SOBRAL(也称为on SO)在他的博文“JSON serialization with reflection in Scala! Part 1 - So you want to do reflection?”中详细介绍了反射带来的一些功能:

概括地说,Scala 2.10 将附带一个 Scala 反射库。
该库由编译器本身使用,但通过the cake pattern 分为多个层,因此不同的用户可以看到不同级别的细节,保持 jar 大小适合每个人的使用,并希望隐藏不需要的细节。

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


2012 年 6 月 14 日更新。(来自 Eugene Burmako):
在 Scala 2.10.0-M4 中,我们发布了新的 reflection API,它很可能在没有重大变化的情况下进入 2.10.0-final。
有关 API 的更多详细信息,请参见:

摘录:

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

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

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

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

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

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

2011 年 9 月的初步回答:

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

(根据this thread,Liftcode 旨在简化“编写代码的代码”)

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

【讨论】:

  • 两个指向 github 提交的链接都不再存在。
  • @om-nom-nom:链接已恢复。它们现在可以在 legacy-svn-scala 存储库中找到。
  • @Eugene:感谢您的编辑。我冒昧地添加了一些链接和参考。
  • SIP = Scala 改进过程
  • @Antoras:该死的,那个不在维基百科消歧页面中!答案已编辑。
【解决方案2】:

两个应该感兴趣的链接:

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

【讨论】:

【解决方案3】:

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

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

上面的代码列出了Symbol 代表类MyClass 成员的对象,它们不是方法。您可以通过多种方式对其进行微调。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    相关资源
    最近更新 更多