我正在努力理解java字节码。我从一个简单的例子开始:
public class Test
{
public static void main(String args[])
{
System.out.println(2 + 1);
}
}
我编译了这个类:
javac Test.java
然后我试着
javap
在.class上,如下所示:
javap -c Test
这给了我:
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: iconst_1
4: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
7: return
}
除了这句话,我还能从中理解:
public static void main(java.lang.String[]);
. . .
3: iconst_1
. . .
查看我的源代码和这个字节代码,看起来javac已经完成了这个语句的加法运算:
2+1
并要求jvm返回该常量。
如果我的理解错误,有人能纠正我吗?javac是否执行编译操作
+
,
-
,
*
在它实际运行在jvm上之前?如果是,怎么办?