LVA操作码用于将一个值从局部变量数组( iload )推送到操作数堆栈上。
此操作码接受单个字节作为参数(en.wikipedia.org/wiki/Java_bytecode_instruction_listings),该参数用作LVA的索引。
如果LVA的一个元素总是对象的引用(我猜静态方法不是这种情况,但现在先忽略这些),如果恰好有一个字节被用作索引(256个可能的值),那么一个方法如何能够访问超过255个不同的局部变量呢?
发布于 2012-12-25 06:14:38
是的,Java方法可以有超过255个局部变量。wide操作码指令可用于修改iload或aload指令,使其使用16位索引而不是8位索引,这意味着只要最终使用wide操作码,函数中就可以有多达65536个不同的局部变量。
也就是说,注意Java局部变量不一定与JVM局部变量一一对应。Java编译器可能会查看您的代码,注意局部变量的空间可以在某些上下文中重用,然后将多个Java局部变量映射到相同的JVM局部变量。
希望这能有所帮助!
发布于 2012-12-25 06:19:26
我为您编写了一个包含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编译,结果完全相同。
https://stackoverflow.com/questions/14026053
复制相似问题