invokevirtual、invokespecial、invokestatic、invokeinterface、invokedynamic介绍

来源:互联网 发布:淘宝网人民法院拍卖 编辑:程序博客网 时间:2024/06/08 02:44

如表格所示:

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


0 0