理解类文件:'putfield Test.a:int [12]'

时间:2013-07-30 08:11:58

标签: java eclipse class compilation

我在eclipse中打开了我的java类文件,我对这一特定行感到疑惑。

iconst_10
putfield Test.a : int [12]

[12]表示什么?它是否表示已分配的字节数?

我的java代码是

class Test {
   public Integer a = 5;
   public static void main(String[] args) {
      Test t = new Test();
      t.a = 4;//This line compiles to the above code.
   }
}

这是javap代码,但与eclipse代码完全不同

public Test();
  Code:
   0:   aload_0
   1:   invokespecial   #10; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   iconst_5
   6:   invokestatic    #12; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
   9:   putfield        #18; //Field a:Ljava/lang/Integer;
   12:  return

public static void main(java.lang.String[]);
  Code:
   0:   new     #1; //class Test
   3:   dup
   4:   invokespecial   #26; //Method "<init>":()V
   7:   astore_1
   8:   aload_1
   9:   iconst_4
   10:  invokestatic    #12; //Method java/lang/Integer.valueOf:(I)Ljava/lang/In
teger;
   13:  putfield        #18; //Field a:Ljava/lang/Integer;
   16:  return

}

3 个答案:

答案 0 :(得分:2)

不是分配的字节。它很可能是字段Test.a的常量池索引。

答案 1 :(得分:2)

  

在字节码中,putfield操作码后跟16位无符号   整数索引。这是常量池中条目的索引   现在的班级。

更多信息:here

答案 2 :(得分:1)

Referring Wikipedia

<强> putfield

  

将字段设置为对象objectref中的值,其中字段为   由常量池中的字段引用索引标识(indexbyte1&lt;&lt;   8 + indexbyte2)

IBM Java Bytecode:此链接通过示例解释了putfield如何工作

  

putfield操作码从堆栈中弹出两个顶部值并存储一个   将strName引用到对象的实例数据名称中   由此引用。

public Employee(String strName, int num)
{
   name = strName;
   idNumber = num;
   storeData(strName, num);
}

Method Employee(java.lang.String,int)
0 aload_0
1 invokespecial #3 <Method java.lang.Object()>
4 aload_0
5 aload_1
6 putfield #5 <Field java.lang.String name>
9 aload_0
10 iload_2
11 putfield #4 <Field int idNumber>
14 aload_0
15 aload_1
16 iload_2
17 invokespecial #6 <Method void storeData(java.lang.String, int)>
20 return