看懂JVM指令,字节码文件如何解析?

3 篇文章 0 订阅

class 文件中的程序的执行逻辑,java 文件中编写程序的逻辑。

JVM 对 class 文件的具体执行方式

1、写 Java 代码
public class Test {
	public static void main (String args[]){
         int i = 10;
         int j = 20;
         int k = i + j;
         System.out.println(k);
    }
}
2、编译成 class 字节码文件(16 进制,程序员根本看不懂)
3、对 class 字节码进行反汇编,成为程序员能看懂的 JVM 指令
javap -c Test.java

结果:

Compiled from "Test.java"
public class Test {
  public Test();
    Code:
       0: aload_0                           //this当前对象入栈
       1: invokespecial #1             // Method java/lang/Object."<init>":()V 要创建Test的构造器,首先创建父类Object的构造器
       4: return                              //构造器的结束

  public static void main(java.lang.String[]);
    Code:
       0: bipush        10                //把10压入操作数栈
       2: istore_1                          //把10从操作数栈取出来赋给变量i,并再次把i压入操作数栈
       3: bipush        20                //把20压入操作数栈
       5: istore_2                          //把20从操作数栈取出来赋给变量j,并再次把j压入操作数栈
       6: iload_1                            //把赋过值的变量i从操作数栈中取出来
       7: iload_2                            //把赋过值的变量j从操作数栈中取出来
       8: iadd                                 //把加号从运算符栈取出来
       9: istore_3                           //把30从操作数栈取出来赋给变量k,并再次把k压入操作数栈
      10: getstatic     #2                 // Field java/lang/System.out:Ljava/io/PrintStream;
      13: iload_3                             //把赋过值的变量k从操作数栈中取出来,就可以用打印流打印出来了
      14: invokevirtual #3                // Method java/io/PrintStream.println:(I)V
      17: return                               //方法的结束
}

总结:
简单来讲就是数据和运算符入栈出栈的过程,数据一般入的是操作数栈,运算符入的是运算符栈,这是计算机组成原理的知识。当有乘法和加法时,如果先入栈的是加法,不会先让两数相加,而是先乘,计算机是怎么做到的?计算机通过判断运算符的优先级,可以得知乘法的优先级高于加法,就会先让两个操作数相乘!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值