jvm-方法调用的字节码分析

public class Demo3_9 { 
    public Demo3_9() { } 
    private void test1() { } 
    private final void test2() { } 
    public void test3() { } 
    public static void test4() { } 
    public static void main(String[] args) { 
        Demo3_9 d = new Demo3_9(); 
        d.test1();// private方法
        d.test2();// final方法 
        d.test3();// public方法 
        d.test4();// static方法 
        Demo3_9.test4(); 
    } 
}

Oracle 提供的 javap 工具来反编译 class 文件,上面程序对应的字节码
在这里插入图片描述
方法调用字节码分析:

执行第0条指令new:首先会为要创建的对象再堆空间的伊甸园分配空间,分配完将对象的引用d压入操作数栈

执行第3条指令dup:将栈顶元素(即对象的引用d)复制一份,因为后续调用完构造方法会将栈顶元素出栈,如果不复制d,调用完构造方法,引用d会被出栈,后面的astore_1就没有东西可以存储到局部变量表了。

执行第4条指令invokespecial:调用构造方法,并将栈顶的引用d的复制出栈

执行第7条指令astore_1:将操作数栈中的引用d放到局部变量表中对应的槽位上

执行第8条指令aload_1:将局部变量表中的引用d加载到操作数栈中

执行第9条指令invokespecial:调用普通方法,并将栈顶元素出栈

。。。

执行第20条指令aload_1:将局部变量表中的引用d加载到操作数栈中

执行第21条指令pop:将操作数栈中的引用d出栈

执行第22条指令invokestatic:调用静态方法

tips:

调用静态构造方法,不需要通过对象来调用,所以第20、21条指令是没有意义的,对象的引用d进操作数栈之后就被pop出来了,调用静态构造方法不需要对象的引用d,所以调用静态方法时建议用类来调用而不是对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值