详情(细节)
要理解字节码的细节,我们需要知道java虚拟机(jvm)是如何执行字节码的。jvm是基于栈的机器。每个线程
都有一个jvm栈来存储其结构。没当一个方法被调用就会创建一个frame,每个frame是由一个操作数栈,一个局部变
量数组和一个当前方法类的一个运行时常量池的引用组成的。
。接着位置1存放第一个形参,位置2存放第二个,以此类推。对于static方法,首先存放的是其第一个参数,位置
为0,以此类推。
局部变量数组的大小是在编译期由局部变量和方法参数的大小和数量决定的。栈采用的是LIFO(后进先出)原则
存取数据的。它的大小也是在编译期决定的。使用特定的指令(opcode)将值压入栈,另一些指令则用来获取栈数
据,并操作这些数据返回结果。栈也被用来接收方法的返回值。
public String employeeName()
{
return name;
}
Method java.lang.String employeeName()
0 aload_0
1 getfield #5 <Field java.lang.String name>
4 areturn
以上字节码由三条指令组成。第一条aload_0将局部变量push到栈中的局部变量数组的索引为0的位置。之前我
们已经知道,对于构造器方法和实例方法,其引用总是会被存放在局部变量数组中索引为0的位置上。第二条指令
getfield用来获取对象的字段。当执行这条指令时,栈顶的值被取出。#5时用来在类的运行时常量池中创建一个索
引,用来存放指向类的引用的名称。
要理解字节码的细节,我们需要知道java虚拟机(jvm)是如何执行字节码的。jvm是基于栈的机器。每个线程
都有一个jvm栈来存储其结构。没当一个方法被调用就会创建一个frame,每个frame是由一个操作数栈,一个局部变
量数组和一个当前方法类的一个运行时常量池的引用组成的。
局部变量数组又称局部变量表( local variable table),它包含了方法的参数,并用来存放局部变量的值。
。接着位置1存放第一个形参,位置2存放第二个,以此类推。对于static方法,首先存放的是其第一个参数,位置
为0,以此类推。
局部变量数组的大小是在编译期由局部变量和方法参数的大小和数量决定的。栈采用的是LIFO(后进先出)原则
存取数据的。它的大小也是在编译期决定的。使用特定的指令(opcode)将值压入栈,另一些指令则用来获取栈数
据,并操作这些数据返回结果。栈也被用来接收方法的返回值。
public String employeeName()
{
return name;
}
Method java.lang.String employeeName()
0 aload_0
1 getfield #5 <Field java.lang.String name>
4 areturn
以上字节码由三条指令组成。第一条aload_0将局部变量push到栈中的局部变量数组的索引为0的位置。之前我
们已经知道,对于构造器方法和实例方法,其引用总是会被存放在局部变量数组中索引为0的位置上。第二条指令
getfield用来获取对象的字段。当执行这条指令时,栈顶的值被取出。#5时用来在类的运行时常量池中创建一个索
引,用来存放指向类的引用的名称。