微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我怎么知道什么Scala版本的.class文件被编译?

我怎么知道什么Scala版本的.class文件被编译?

解决方法

如果您使用带有详细选项的javap,则可以在类文件中查看Scala Major / Minor版本.例如,对于使用scala 2.8.0 final编译的文件,将显示以下内容

javap -private -verbose T

Compiled from "SomeTest.scala"
public interface T
  SourceFile: "SomeTest.scala"
  ScalaSig: length = 0x3
   05 00 00 
  RuntimeVisibleAnnotations: length = 0xB
   00 01 00 06 00 01 00 07 73 00 08 
  minor version: 0
  major version: 49
  Constant pool:
const #1 = Asciz    SourceFile;
const #2 = Asciz    SomeTest.scala;
const #3 = Asciz    s;
const #4 = Asciz    ()Ljava/lang/String;;
const #5 = Asciz    ScalaSig;

//etc etc...

而以下是使用scala 2.7.7编译的文件输出

javap -verbose T2
Compiled from "SomeTest2.scala"
public interface T2
  SourceFile: "SomeTest2.scala"
  ScalaSig: length = 0x87
   04 01 1B 06 08 01 02 FFFFFF84 FFFFFF90 FFFFFF80 FFFFFF91 00 05 02 02 54
   32 0A 01 03 01 07 3C 65 6D 70 74 79 3E 03 00 13
   02 00 06 10 02 07 0C 0D 01 08 0A 02 09 0A 01 04
   6C 61 6E 67 0A 01 0B 01 04 6A 61 76 61 09 02 0D
   08 02 06 4F 62 6A 65 63 74 08 05 0F 00 FFFFFF86 00 10
   01 01 73 15 01 11 10 02 12 18 0E 02 13 16 0D 01
   14 0A 01 15 01 05 73 63 61 6C 61 09 02 17 14 01
   06 50 72 65 64 65 66 09 02 19 1A 02 06 53 74 72
   69 6E 67 0A 02 17 14 
  minor version: 0
  major version: 49
  Constant pool:
const #1 = Asciz    SourceFile;
const #2 = Asciz    SomeTest2.scala;

//etc etc...

ScalaSig常量条目的前两个字节应该代表Scala Major / Minor版本,我相信它们在PickleFormat中定义.2.7.7版本的PickleFormat可以在here中找到,并显示主要/次要版本与2.8.0版本.

我也检查了2.7.1版本的this class,但是这里的Major / Minor版本与2.7.7版本相同,因此您可能无法通过使用此方法区分次要scala版本.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐