我正在通过阅读Java虚拟机规范
来学习java的汇编语言我对LocalVariableTable属性感到困惑,官方文档说当执行.class文件时,LocalVariableTable的所有插槽都可以被重用。
我无法编写任何这样编译的代码:
sipush xxx
istore_0
.....
dup
astore_0
谁能给我一些例子吗?
不存在“java的汇编语言”,因此无法使用JDK提供的工具编译出伪汇编代码。你只能使用另一个方向,用
javap
打印已编译类的字节码。
有第三方工具为 JVM 提供汇编语言,例如Krakatau,但这两者都不是标准的一部分。大多数这些语言看起来都很相似,甚至与其他工具兼容,因为它们使用 JVM 规范中相同的助记符和
javap
的输出格式作为起点。
重用变量槽是一件微不足道的事情。当局部变量具有分离作用域时,这种情况总是会发生。例如
import java.util.spi.ToolProvider;
public class ReusedVariableSlots {
static class Example {
public static void exampleMethod() {
{ short s = 1234; }
{ Object o = null; }
}
private Example() {}
}
public static void main(String... arg) {
ToolProvider.findFirst("javap").ifPresentOrElse(
javap ->javap.run(System.out, System.err, "-c", Example.class.getName()),
() -> System.out.println("javap not found"));
}
}
将打印类似的内容
Compiled from "ReusedVariableSlots.java"
class ReusedVariableSlots$Example {
public static void exampleMethod();
Code:
0: sipush 1234
3: istore_0
4: aconst_null
5: astore_0
6: return
}