我知道下面的说明意味着已经进行了方法调用:
invokestatic:indexbyte1=00 indexbyte2=02
我的理解是,要在被调用方法的常量池中找到索引,执行位移操作:
00 << 8 + 02
这等于零,这不是常量池索引中的有效条目。我误解了所需的计算吗?
我想了解这是如何手动完成的,因此反编译器无济于事。
答案 0 :(得分:4)
索引不计算为00 << 8 + 02
。引用the standard:
unsigned indexbyte1和indexbyte2用于构造当前类(§2.6)的运行时常量池的索引,其中索引的值为(indexbyte1&lt;&lt; 8)| indexbyte2。
这意味着指令invokevirtual 00 02
将调用其methodref位于constantpool中的索引(00 << 8) | 02
的方法,即位置2.请记住,constantpool中的第一个条目具有索引1,所以index 2实际上是指池的第二个条目。