我明白,下面的指令是指一个方法调用已经发生:口译JVM的方法调用的指令
invokestatic:indexbyte1=00 indexbyte2=02
我的理解是,找到了该方法的常量池索引被调用时,移位操作执行:
00 << 8 + 02
这等于零,这不是常量池索引中的有效条目。我误解了所需的计算?
我想了解这是如何手动完成的,所以反编译器将无济于事。
我明白,下面的指令是指一个方法调用已经发生:口译JVM的方法调用的指令
invokestatic:indexbyte1=00 indexbyte2=02
我的理解是,找到了该方法的常量池索引被调用时,移位操作执行:
00 << 8 + 02
这等于零,这不是常量池索引中的有效条目。我误解了所需的计算?
我想了解这是如何手动完成的,所以反编译器将无济于事。
该指数不计算为00 << 8 + 02
。引述the standard:
无符号indexbyte1和indexbyte2被用于构建一个索引到当前类(§2.6),其中该指数的值是在运行时常量池(indexbyte1 < < 8) | indexbyte2。
这意味着指令invokevirtual 00 02
将调用其methodref位于索引(00 << 8) | 02
在常量池,即该方法中,在2位请记住,在常量池的第一个条目具有的索引1,索引所以2实际上是指池的第二个条目。
谢谢你,现在有道理。 – Dawson
如果你想在java中计算它,你应该使用:0x00 << 8 + 0x02 –
OP不是询问Java(语言),而是关于由JVM执行的指令,即javac的输出。 –