Java ByteCode算术运算

ico*_*ner 0 java bytecode .class-file

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

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

使用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
Run Code Online (Sandbox Code Playgroud)

在这一行:

 0: bipush        49
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 5

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

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

如果你想看看表达式评估的字节码是什么样的,你需要使用参数,局部变量等作为表达式中的"初选"; 例如

public int myMethod(int a, int b, int c) {
    return a + b * c / 42;
}
Run Code Online (Sandbox Code Playgroud)