Javac实现:方法调用产生什么jvm指令?
假设我在java中有一个方法调用站点。等效的jvm字节码是什么(除了转换为invokevirtual/static e.t.c的调用)?我更感兴趣的是在堆栈上加载接收器的命令 -显然,一个命令是aload -另一种可能是另一个调用返回堆栈上的重新对象 -第三,新指令。(例如新的A().foo()。它会被复制。但是复制的内容会被构造函数使用) -四个,也许(??)Dup。(如果有a.foo();a.bar();编译器是否有可能生成aload然后生成dup而不是aload aload?) 我最大的问题是剩余的dup命令。因为他们会洗牌。javac什么时候生产它们?它在编译呼叫站点时是否使用它们 我一直在努力寻找没有运气的纪录片。然后找到了源代码,但要深入研究还需要几天时间。我相信这些文件负责翻译/编译过程。几乎任何产生引用的字节码指令都可以被javac用来加载接收器Javac实现:方法调用产生什么jvm指令?,java,jvm,javac,method-call,Java,Jvm,Javac,Method Call,假设我在java中有一个方法调用站点。等效的jvm字节码是什么(除了转换为invokevirtual/static e.t.c的调用)?我更感兴趣的是在堆栈上加载接收器的命令 -显然,一个命令是aload -另一种可能是另一个调用返回堆栈上的重新对象 -第三,新指令。(例如新的A().foo()。它会被复制。但是复制的内容会被构造函数使用) -四个,也许(??)Dup。(如果有a.foo();a.bar();编译器是否有可能生成aload然后生成dup而不是aload aload?) 我最大的问
- aload、invokeX、new+dup
你刚才提到的那些 - getfield,getstatic
field.method();
MyClass.class.getName();
- aaload
arr[index].method();
- anewarray
(new Object[0]).hashCode();
(new byte[5][10]).getClass();
- multianewarray
(new Object[0]).hashCode();
(new byte[5][10]).getClass();
- checkcast
((List) obj).size();
- ldc
field.method();
MyClass.class.getName();
- acost\u null
((Object) null).getClass();
- dup
这里的IntSupplier s = field::hashCode;
+dup
用于发出一个复杂的空检查:invokevirtual
getstatic #2 // Field field:Ljava/lang/String; dup invokevirtual #3 // Method java/lang/Object.getClass:()Ljava/lang/Class; pop invokedynamic #4, 0 // InvokeDynamic #0:getAsInt
javac
使用dup
进行构造函数调用。通常,在解引用同一变量时,它不使用dup
。变量访问总是被编译成变量访问。但反过来说,它可能会添加源代码中没有出现的合成变量。堆栈操作相当罕见。但是一个例子是objArray[index]+=“string”
,它使用dup2
(在JDK11中)克隆数组引用和索引,因为更新需要aaload
和aastore
。另一个场景是(变量=表达式).method()
;请注意,从JDK 9开始,编译器将插入一个Objects.requirennoull(…)
调用,而不是….getClass()
以进行内部null
检查(另请参阅)