JVM method dispatch:修订间差异
第11行: | 第11行: | ||
invoke a static method, the method is from the constant pool by <syntaxhighlight lang="java">index= (indexbyte1 << 8) | indexbyte2</syntaxhighlight> | invoke a static method, the method is from the constant pool by <syntaxhighlight lang="java">index= (indexbyte1 << 8) | indexbyte2</syntaxhighlight> | ||
<syntaxhighlight lang="java"> | |||
public class Hello { | public class Hello { | ||
public static void sayHello(String msg) { | public static void sayHello(String msg) { | ||
第24行: | 第21行: | ||
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
compiled: | |||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
// Riguz! | // Riguz! | ||
第44行: | 第43行: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== invokevirtual == | == invokevirtual == |
2021年4月14日 (三) 00:58的版本
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!");
}
}
compiled:
// 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