Java1.8环境下,我们在编写程序时会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种:

  1. invokespecial:调用私有实例方法;
  2. invokestatic:调用静态方法;
  3. invokevirtual:调用实例方法;
  4. invokeinterface:调用接口方法;
  5. invokedynamic:调用动态方法;

这里我们通过一个实例将这些方法调用的字节码指令逐个列出。

实例源码

实例共两个java文件,一个是接口另一个是类,先看接口源码,很简单只有一个方法声明:

package com.bolingcavalry;  public interface Action {     void doAction(); }

接下来的类实现了这个接口,而且还有自己的共有、私有、静态方法:

package com.bolingcavalry;  public class Test001 implements Action{     private int add(int a, int b){         return a+b;     }      public String getValue(int a, int b){         return String.valueOf(add(a,b));     }      public static void output(String str){         System.out.println(str);     }      @Override     public void doAction() {         System.out.println("123");     }      public static void main(String[] args){         Test001 t = new Test001();         Action a = t;         String str = t.getValue(1,2);         t.output(str);         t.doAction();         a.doAction();     }          public void createThread(){         Runnable r = () -> System.out.println("123");     } }

小结一下,Test001的代码中主要的方法如下:

  1. 一个私有方法add;
  2. 一个公有方法getValue,里面调用了add方法;
  3. 一个静态方法output;
  4. 实现接口定义的doAction;
  5. 一个公有方法,里面使用了lambda表达式;
  6. main方法中,创建对象,调用getValue,output,doAction;

接下来我们通过javac命令或者ide工具得到Action.class和Test001.class文件,如果是用Intellij IDEA,可以先把Test001运行一遍,然后在工程目录下找到out文件夹,打开后里面是production文件夹,再进去就能找到对应的package和class文件了,如下图:

这里写图片描述

打开命令行,在Test001.class目录下执行javap -c Test001.class
,就可以对class文件进行反汇编,得到结果如下:

Compiled from "Test001.java" public class com.bolingcavalry.Test001 implements com.bolingcavalry.Action {   public com.bolingcavalry.Test001();     Code:        0: aload_0        1: invokespecial #1                  // Method java/lang/Object."<init>":()V        4: return    public java.lang.String getValue(int, int);     Code:        0: aload_0        1: iload_1        2: iload_2        3: invokespecial #2                  // Method add:(II)I        6: invokestatic  #3                  // Method java/lang/String.valueOf:(I)Ljava/lang/String;        9: areturn    public static void