我正在尝试理解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上运行之前等等?如果是这样怎么办?
2 + 1 是编译时常量表达式。编译器本身在字节码中将其替换为 3。
See the Java语言规范,其中说:
某些表达式的值可以在编译时确定。这些是常量表达式。
See 这另一章常量表达式的构成是什么
常量表达式是表示基本类型值或不会突然完成的字符串的表达式,并且仅使用以下内容组成:
- 原始类型的文字和 String 类型的文字 [...]
- 加法运算符 + 和 -
[...]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)