为什么在已编译的Scala类上运行javap会在常量池中显示奇怪的条目?

时间:2011-04-07 20:48:20

标签: scala jvm openjdk

在Scala(版本2.8.1 final)的编译类上运行javap -v时:

class Point(x:Int,y:Int)

我得到常量池条目的以下输出,以及指示不可打印字符的几个终端蜂鸣声?

#19 = Utf8               Lscala/reflect/ScalaSignature;
#20 = Utf8               bytes
#21 = Utf8               \t2\"\t!!>Lg9A(Z7qift4A\nqCA\r!BA
                                                        aM\4
                                                            -\tAA[1wC&Q\nTWm;=R\"\t
                                                                                     E\tQa]2bYL!a\tMr\1PE*,7\r\t+\t)A-\t/%:$

eDu\taP5oSRtDc!CAqA!)Qca-!)!da-
#22 = Utf8               RuntimeVisibleAnnotations
#23 = Utf8               Point
#24 = Class              #23            //  Point

知道发生了什么,为什么?我之前从未见过CONSTANT_Utf8条目中的二进制垃圾。

我在Mac 10.6上使用OpenJDK 7版本,如果这有所不同 - 我将尝试在明天复制我有其他操作系统时,并会相应更新。

1 个答案:

答案 0 :(得分:8)

ScalaSignature元素是存储Scala所需的额外类型信息的位置。它现在正在注释中存储(显然编码),以便它可以用于反射工具。