我在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
}
答案 0 :(得分:2)
不是分配的字节。它很可能是字段Test.a
的常量池索引。
答案 1 :(得分:2)
在字节码中,putfield操作码后跟16位无符号 整数索引。这是常量池中条目的索引 现在的班级。
更多信息:here
答案 2 :(得分:1)
<强> 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