2015-05-29 23 views
2

我明白,下面的指令是指一个方法调用已经发生:口译JVM的方法调用的指令

invokestatic:indexbyte1=00 indexbyte2=02 

我的理解是,找到了该方法的常量池索引被调用时,移位操作执行:

00 << 8 + 02 

这等于零,这不是常量池索引中的有效条目。我误解了所需的计算?

我想了解这是如何手动完成的,所以反编译器将无济于事。

+0

如果你想在java中计算它,你应该使用:0x00 << 8 + 0x02 –

+0

OP不是询问Java(语言),而是关于由JVM执行的指令,即javac的输出。 –

回答

4

该指数不计算为00 << 8 + 02。引述the standard

无符号indexbyte1和indexbyte2被用于构建一个索引到当前类(§2.6),其中该指数的值是在运行时常量池(indexbyte1 < < 8) | indexbyte2。

这意味着指令invokevirtual 00 02将调用其methodref位于索引(00 << 8) | 02在常量池,即该方法中,在2位请记住,在常量池的第一个条目具有的索引1,索引所以2实际上是指池的第二个条目。

+0

谢谢你,现在有道理。 – Dawson

相关问题