当我编译这个简单的代码时
class Main {
public void execute() { }
public static void main(String[] args) {
Runnable run = new Main()::execute;
}
}
我得到主方法的以下字节代码:
0 new user.Main [2]
3 dup
4 invokespecial user.Main() [3]
7 dup
8 invokevirtual java.lang.Object.getClass() : java.lang.Class [4] // <--- ???
11 pop
12 invokedynamic 0 run(user.Main) : java.lang.Runnable [5]
17 astore_1 [run]
18 return
我想知道为什么编译器决定发出invokevirtual java.lang.Object.getClass()
直接跟随pop
。这看似毫无用处的电话的目的是什么?