Java ByteCode算术运算

时间:2014-06-01 03:06:24

标签: java bytecode .class-file

我要为学校项目制作一个简单的编译器,我想要生成.class文件,我读取文件格式但是要更好地理解.class文件格式和我有这个类的java字节码: / p>

public class Me {
    public void myMethod() {
        int a = 5 * 4 + 3 - 2 + 1 / 7 + 28;
    }
}

使用javap命令我得到这个(对于' myMethod'):

public void myMethod();
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=1
         0: bipush        49
         2: istore_1      
         3: return        
      LineNumberTable:
        line 3: 0
        line 4: 3
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       4     0  this   LMe;
               3       1     1     a   I

在这一行:

 0: bipush        49

我不明白,当我们得到那个数字(49)时,我看不到算术运算的字节代码' 5 * 4 + 3 ......'

1 个答案:

答案 0 :(得分:5)

  

我不明白当我们得到那个数字(49)时,我看不到算术运算的字节代码' 5 * 4 + 3

字节码编译器正在优化它们。根据JLS定义,表达式是常量表达式,这意味着允许java编译器在编译时对其进行评估,并将结果值硬编码到类文件中。

如果你想看看表达式评估的字节码是什么样的,你需要使用参数,局部变量等作为" primaries"在表达中; e.g。

public int myMethod(int a, int b, int c) {
    return a + b * c / 42;
}