1、針對對象的作業碼
執行個體化一個新對象需要通過new作業碼來實現。
對象的建立
作業碼
運算元
說明
new
index
在堆中建立一個新的對象,將其引用壓入棧
new作業碼後面緊跟一個無符號16位元,表示常量池中的一個索引。在特定位移量位置處的常量池入口給出了新對象所屬類的資訊。如果還沒有這些資訊,那麼虛擬機器會解析這個常量池入口。它會為這個堆中的對象建立一個新的執行個體,用預設初始化對象執行個體變數,然後把新對象的引用壓入棧。
存取執行個體變數
作業碼
運算元
說明
putfield
index
設定對象欄位(由index指定)的值,值value和對象引用objectref均從棧中獲得
getfield
index
將對象欄位(由index指定)壓入棧,對象引用objectref棧中取得
存取類變數
作業碼
運算元
說明
putstatic
index
設定靜態欄位(由index指定)的值,值value從棧中獲得
getstatic
index
將靜態欄位(由index指定)壓入棧
putfield和getfield這兩個作業碼只在欄位是執行個體變數的情況下才執行,putstatic和getstatic對靜態變數進行存取操作。運算元表示常量池的索引。這個索引所指向的常量池入口包含了該欄位的所屬類、名字和類型等資訊。如果還沒有這些資訊,虛擬機器會解析這個常量池入口。
例如下面代碼:
public class testa {
int x;
int y;
}
public class testmain {
/**
* @param args
*/
public static void main(string[] args) {
// todo auto-generated method stub
testa testa = new testa();
testa.x = 3;
testa.y = 4;
}
}
用javap工具查看其位元組碼指令為:
compiled from "testmain.java"
public class testmain extends java.lang.object{
public testmain();
code:
0: aload_0
1: invokespecial #8; //method java/lang/object."<init>":()v
4: return
public static void main(java.lang.string[]);
code:
0: new #16; //class testa 建立 testa對象
3: dup //
4: invokespecial #18; //method testa."<init>":()v 調用構造方法
7: astore_1 //存入位置為1的局部變數
8: aload_1 //取出位置為1的局部變數壓入棧
9: iconst_3 //常量3入棧
10: putfield #19; //field testa.x:i 賦值
13: aload_1
14: iconst_4
15: putfield #23; //field testa.y:i
18: return
}