对象的创建与访问指令
创建指令
- 虽然类实例和数组都是对象,但Java虚拟机对类实例和数组的创建和操作使用了不同的字节码指令
- 创建类实例指令:new
- 它接收一个操作数,指向常量池的索引,表示要创建的类型,执行完成后,将对象的引用压入操作数栈
- 创建数组的指令:newarray,arewarray,multianewarray
- newarray:创建基本类型数组
- anewarray:创建引用类型数组
- multianewarray:创建多维数组
字段访问指令
- 对象创建后,可能通过对象访问指令获得对象实例或数组实例中的字段或数组元素
- 访问字段(static字段,或称为类变量)的指令:getstatic,putstatic
- 访问类实例字段(非static字段,可实例变量):getfield,putfield
如:以getstatic指令为例,它含有一个操作数,为指向常量池的Fieldref索引,它的作用是获取Fieldref指定的对象或者值,并将其压入操作数栈
public void sayHello() {
System.out.println("hello");
}
0 getstatic #8 <java/lang/System.out>
3 ldc #9 <hello>
5 invokevirtual #10 <java/io/PrintStream.println>
8 return
数组操作指令
- 数组操作指令主要有:xastore和xaload指令
- 把一个数组元素加载到操作数栈的命令:baload,caload,saload,iaload,laload,faload,daload,aaload
- 将一个操作数栈的值存储到数组元素中的指令:bastore,castore,sastore,iastore,lastore,fastore,dastore,aastore

- 取数组长度的指令:arraylength
- 该指令弹出栈顶的数组元素,获取数组的长度,将长度压入栈
public void arrLength() {
double[] arr = new double[10];
System.out.println(arr.length);
}
0 bipush 10
2 newarray 7 (double)
4 astore_1
5 getstatic #8 <java/lang/System.out>
8 aload_1
9 arraylength
10 invokevirtual #14 <java/io/PrintStream.println>
13 return
- 指令xload表示将数组的元素压栈,如saload,caload表示压入short数组和char数组,指令xaload在执行时,要求操作数中栈顶元素为数组索引i,栈顶顺位第二个元素为数组引用a,该指令会弹出栈顶这两个元素,并将a[i]重新压入堆栈
- xastore则专门针对数组操作,以iastore为例