我使用“javap -verbose”解析一个类文件,发现常量池丢失#3,谁能告诉我原因?
请注意,前面的条目具有类型Long
,其文档说:
所有 8 字节常量都占用文件
constant_pool
表中的两个条目class
。如果 aCONSTANT_Long_info
orCONSTANT_Double_info
结构是constant_pool
表中索引n处的项目,则池中的下一个可用项目位于索引n +2 处。constant_pool
索引n +1 必须有效但被视为不可用。
和整洁的补充
回想起来,让 8 字节常量占用两个常量池条目是一个糟糕的选择。
所以javap
决定简单地跳过不可用的条目,而不是打印诸如“<code>#3 unusable”之类的东西……</p>
Longs 和 Doubles 占用常量池中的两个插槽,因此跳过它们之后的插槽。在这种情况下,插槽 2 持有 Long,因此插槽 3 被跳过。