解析Java字节码中invokedynamic指令及其对操作数栈的影响
关于invokedynamic指令操作数栈状态的疑问
我想明确Java字节码中invokedynamic指令的工作机制,为此准备了一段使用Lambda表达式的简单Java代码——这类代码编译后通常会生成invokedynamic指令:
public class App{ public static void main(String... args){ Runnable r = () -> {}; r.run(); } }
用javac编译后生成的字节码如下:
0: invokedynamic #7, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable; 5: astore_1 6: aload_1 7: invokeinterface #11, 1 // InterfaceMethod java/lang/Runnable.run:()V 12: return
我的理解是:执行invokedynamic指令后,操作数栈中会包含一个CallSite(引导方法的结果),随后该CallSite会被存入变量并执行。
但维基百科对invokedynamic指令的描述是:
[invokedynamic instruction] invokes a dynamic method and puts the result on the stack (might be void);
这句话里的“可能为void”让我困惑:这是否意味着引导方法不一定返回CallSite?我尝试寻找能生成不向操作数栈放入任何值的invokedynamic指令的Java代码片段,但始终未能找到。
我需要澄清:invokedynamic指令是否可能不向操作数栈放入任何内容(包括CallSite)?我查阅了StackOverflow上的相关回答,但没有明确涉及操作数栈状态的内容;此外我尝试寻找字节码调试器来检查操作数栈状态,也没有成功,希望能得到相关见解或指导。
内容的提问来源于stack exchange,提问作者Volodya Lombrozo
相关产品推荐
相关产品推荐

