1

我在 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

}
4

3 回答 3

2

它不是分配的字节。最有可能的是将索引放入常量池中的字段Test.a

于 2013-07-30T08:12:45.210 回答
2

在字节码中,putfield 操作码后跟一个 16 位无符号整数索引。这是当前类的常量池中条目的索引。

更多信息:这里

于 2013-07-30T08:16:01.050 回答
1

参考维基百科

普特菲尔德

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

IBM Java Bytecode:此链接以示例说明 putfield 的工作原理

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

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
于 2013-07-30T08:22:02.643 回答