iload
Java 操作码用于将值从局部变量数组 (LVA) 压入操作数堆栈。
此操作码将单个字节作为参数 ( en.wikipedia.org/wiki/Java_bytecode_instruction_listings ),用作 LVA 的索引。
如果 LVA 的一个元素始终是对对象的引用(我想这不是静态方法的情况,但现在让我们忽略这些),并且如果恰好一个字节用作索引(256 个可能的值),那么一个方法如何能够访问超过 255 个不同的局部变量呢?
是的,Java 方法可以有超过 255 个局部变量。操作码指令可wide
用于修改iload
oraload
指令以使用 16 位索引而不是 8 位索引,这意味着您可以在函数中拥有多达 65536 个不同的局部变量,只要wide
操作码最终被使用.
也就是说,请注意 Java 局部变量不一定与 JVM 局部变量一一对应。Java 编译器可能会查看您的代码,注意到局部变量的空间可以在某些上下文中重用,然后将多个 Java 局部变量映射到相同的 JVM 局部变量。
希望这可以帮助!
我通过编写一个包含 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 编译,结果完全相同。