如表格所示:
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