iload
Java操作码用于将值从局部变量数组(LVA)推送到操作数堆栈。
此操作码将单个字节作为参数(en.wikipedia.org/wiki/Java_bytecode_instruction_listings),用作LVA的索引。
如果LVA的一个元素始终是对象的引用(我猜这不是静态方法的情况,但是现在让我们忽略它们),并且如果只使用一个字节作为索引(256个可能)值),那么一个方法如何访问超过255个不同的局部变量?
答案 0 :(得分:16)
是的,Java方法可能有超过255个局部变量。 wide
操作码指令可用于修改iload
或aload
指令以使用16位索引而不是8位索引,这意味着您最多可以有65536个不同的索引函数中的局部变量,只要wide
操作码最终被使用。
那就是说,请注意Java局部变量不一定与JVM局部变量一一对应。 Java编译器可能会查看您的代码,注意本地的空间可以在某些上下文中重用,然后将多个Java本地映射到相同的JVM局部变量。
希望这有帮助!
答案 1 :(得分:11)
我通过编写300个本地变量的程序为您尝试了。这个片段:
System.out.println(a255);
System.out.println(a256);
编译成:
3575: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
3578: iload 255
3580: invokevirtual #53 // Method java/io/PrintStream.println:(I)V
3583: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
3586: iload_w #256 // Utf8 a196
3590: invokevirtual #53 // Method java/io/PrintStream.println:(I)V
注意:使用Eclipse和javac编译,结果完全相同。