invokevirtual、invokespecial、invokestatic、invokeinterface、invokedynamic介绍

如表格所示:

invokevirtual

Invoke instance method; dispatch based on class
执行一般实例方法,创建完实例对象后,obj.method()调用的
invokespecial         
Invoke instance method; special handling for superclass, private, and instance initialization method invocations
实例初始化方法(构造函数)、父类的方法(super.method()方式调用)、私有方法
invokeinterface
Invoke interface method
执行接口方法
invokestatic
Invoke a class (static) method
执行静态方法
invokedynamic

Invoke dynamic method

jdk1.7新增,执行动态方法,不需要在编译时确定

举个例子:

package org.zheng.jvmcmd;

/**
 * Create by zxb on 2017/4/16
 */
class SuperClass {

    public String method() {
        return "from SuperClass...";
    }

    public void otherMethod() {
        System.out.println("In SuperClass otherMethod()...");
        System.out.println("SuperClass otherMethod() calls method(): " + method());   //invokevirtual编译时确定
    }
}

class SubClass extends SuperClass {

    public String method() {
        return "from SubClass...";
    }

    public void subMethod() {
        System.out.println("SubClass calls super.method(): " + super.method());   //invokespecail
        privateMethod();  //invokespeical
    }

    private void privateMethod() {
        System.out.println("This is private Method From SubClass");
    }
}

interface ITest {

    void print();
}

class TestImpl implements ITest {

    public void print() {
        System.out.println("print in TestImpl...");
    }
}

public class InvokeTest {

    public static void staticMethod() {
        System.out.println("I am static method..");
    }

    public static void main(String args[]) {
        staticMethod();  //invokestatic

        SubClass b = new SubClass(); //invokespecial 初始化
        SuperClass supper = b;              //向上转型引用
        System.out.println(supper.method());//invokevirtual,当前引用的对象是b

        b.subMethod();  //invokevirtual
        b.otherMethod();  //invokevirtual

        ITest iTest = new TestImpl();  //invokespcial 初始化
        iTest.print();   //invokeinterface
    }
}

使用命令javac -encoding UTF-8 InvokeTest.java

使用命令javap -p -v InvokeTest.class


使用命令javap -p -v SuperClass.class


使用命令javap -p -v SubClass.class


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值