gpt4 book ai didi

java - 为什么在调用 class.NewInstance() 时使用 InvokeVirtual 而不是 InvokeSpecial?

转载 作者:行者123 更新时间:2023-11-29 04:33:53 25 4
gpt4 key购买 nike

我正在研究以下 java 程序的反汇编

public class ASMPlayground {
private String bar;

public String getBar(){
return bar;
}

public void setBar(String bar) throws IllegalAccessException, InstantiationException {
String name = String.class.newInstance();
System.out.println(name);
}

public static void main(String[] args) {

}
}

下面的字节码片段引起了我的注意,但似乎不是最佳的

LDC Ljava/lang/String;.class
INVOKEVIRTUAL java/lang/Class.newInstance ()Ljava/lang/Object;
CHECKCAST java/lang/String

问题:

InvokeVirtual 在要执行的方法依赖于对象引用时使用。鉴于“类”是最终的并且 newInstance() 只存在在“类”中为什么不使用 InvokeSpecial 而不是 InvokeVirtual ?这不是更高效吗?

最佳答案

InvokeSpecial 用于指定调用

superclass, private, and instance initialization method invocations

规范:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokespecial

Class.newInstance 既不是父类(super class)方法调用,也不是私有(private)方法调用,也不是初始化方法调用。它也不是动态方法,InvokeDynamic 与此处无关。这两条指令都不能在这里使用,因为它会对抗 jvms。在创建 jvms 时,可以允许用“性能更高”的指令替换某些指令,但正如我在 jvms 中看到的那样,它还没有完成。

Wouldn't it be more performant?

JIT 足够聪明,可以理解在这种情况下不需要遍历虚拟方法表,因此它不应该减慢执行速度。实际性能应该通过实际测试进行比较,但我看不出有什么理由认为那里会有显着差异。

关于java - 为什么在调用 class.NewInstance() 时使用 InvokeVirtual 而不是 InvokeSpecial?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42610150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com