JVM method dispatch

来自WHY42
Riguz讨论 | 贡献2021年4月7日 (三) 14:20的版本 →‎invokevirtual

Method invocation

invokestatic

invoke a static method:

invokestatic
indexbyte1
indexbyte2

invoke a static method, the method is from the constant pool by

index= (indexbyte1 << 8) | indexbyte2
說明文字
public class Hello {
    public static void sayHello(String msg) {
        System.out.println(msg);
    }

    public static void main(String[] args) {
        sayHello("Riguz!");
    }
}
👉
// Riguz!
#4 = String             #23
// com/riguz/Hello.sayHello:(Ljava/lang/String;)V
#5 = Methodref          #6.#24 
...
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=1, args_size=1
         0: ldc           #4
         2: invokestatic  #5
         5: return
      LineNumberTable:
        line 9: 0
        line 10: 5
}

invokevirtual

Invoke instance method; dispatch based on class

invokevirtual
indexbyte1
indexbyte2

Operand stack:

..., objectref, [arg1, [arg2 ...]] →
// java/lang/System.out:Ljava/io/PrintStream;
#2 = Fieldref           #19.#20
// java/io/PrintStream.println:(Ljava/lang/String;)V   
#3 = Methodref          #21.#22   
...       
  public static void sayHello(java.lang.String);
    descriptor: (Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=1, args_size=1
         0: getstatic     #2
         3: aload_0
         4: invokevirtual #3
         7: return

invokespecial

invokeinterface

invokedynamic