5

When decompiling Scala files to Java code, one often comes across classes that are annotated with the ScalaSignatures. These seem to only have one annotation value, a somewhat encoded String. Why does the Scala Compiler create such an odd construct, instead of using custom Attributes in the class file?

4

1 回答 1

7

来自类文件中腌制 Scala 签名的存储

将签名存储为属性的传统方法同时比使用注释更优雅、更紧凑(约 15%)和更简单。但是,要访问属性中的腌制签名需要获取和解析整个类文件。由于 JVM 可以识别注解,因此新方法允许使用 Java 反射直接从正在运行的 Scala 程序中检索腌制的签名字节。

新方法是编写良好 Scala 反射库的持续开发的一部分。Java 反射以简化的以 Java 为中心的方式查看 Scala 程序。为了给出反射程序的以 Scala 为中心的视图,Java 反射提供的信息必须与 Scala 签名中的信息一起完成。传统的存储方法需要再次解析所有类文件——JVM 已经解析了它们并通过反射暴露了它们的大部分内容。新的存储方法允许以与获取其他反射信息相同的方式访问腌制的 Scala 签名,从而使新的 Scala 反射库更简单、更快。

虽然 Scala 反射库不会成为 2.8 版本的一部分,但希望现有的 2.8 类文件在新的反射库可用时与它兼容。此外,由于 2.8 的类文件在任何情况下都与 2.7 的类文件不兼容,因此在 2.8 中更改存储签名的方法将不需要在不久之后再次更改二进制不兼容的类文件格式。

于 2015-03-26T05:57:10.723 回答