6

iloadJava 操作码用于将值从局部变量数组 (LVA) 压入操作数堆栈。

此操作码将单个字节作为参数 ( en.wikipedia.org/wiki/Java_bytecode_instruction_listings ),用作 LVA 的索引。

如果 LVA 的一个元素始终是对对象的引用(我想这不是静态方法的情况,但现在让我们忽略这些),并且如果恰好一个字节用作索引(256 个可能的值),那么一个方法如何能够访问超过 255 个不同的局部变量呢?

4

2 回答 2

17

是的,Java 方法可以有超过 255 个局部变量。操作码指令可wide用于修改iloadoraload指令以使用 16 位索引而不是 8 位索引,这意味着您可以在函数中拥有多达 65536 个不同的局部变量,只要wide操作码最终被使用.

也就是说,请注意 Java 局部变量不一定与 JVM 局部变量一一对应。Java 编译器可能会查看您的代码,注意到局部变量的空间可以在某些上下文中重用,然后将多个 Java 局部变量映射到相同的 JVM 局部变量。

希望这可以帮助!

于 2012-12-24T22:14:37.547 回答
12

我通过编写一个包含 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 编译,结果完全相同。

于 2012-12-24T22:19:25.627 回答