将Scala文件反编译为Java代码时,通常会遇到使用ScalaSignature
注释的类。这些似乎只有一个注释值,有点编码的String。为什么Scala编译器会创建这样一个奇怪的构造,而不是在Attribute
文件中使用自定义class
?
答案 0 :(得分:4)
来自Storage of pickled Scala signatures in class files:
在 遗产 存储签名的方法 作为属性 同时更优雅, 更紧凑(约15%),更简单 而不是使用注释。 但是,访问 腌渍签名 在属性中 要求 获取和解析 该 整个类文件。 由于JVM可以识别注释,因此新方法允许检索 腌制 签名 字节 直接从内部 一个正在运行的Scala程序 通过使用Java反射。
新方法 是 写作的持续发展的一部分 一个 好 斯卡拉 反射 图书馆。 Java反射 意见 斯卡拉 程序 简化的以Java为中心的方式。给一个 以Scala为中心的反映程序视图,由Java反射提供的信息必须 完成 找到的信息 Scala签名。 该 遗产 存储方法 本来需要的 所有 要解析的类文件 再次 - JVM已经解析了它们 并通过反思公开他们的大部分内容。 新的存储空间 方法允许 访问 腌制Scala签名 以与其他反射信息相同的方式 获得,使新的Scala反射库更简单,更快。
虽然Scala反射库不是2.8版本的一部分,但它是 合意 那 现有 2.8类文件在成为时与新的反射库兼容 可用。 此外,由于2.8类文件与2.7的文件不兼容 在任何情况下, 改变 存储方法 签名 在2.8 不需要 另一个 二进制兼容 类文件格式 更改 不久之后。