【发布时间】:2017-03-05 15:25:15
【问题描述】:
我正在研究以下 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) {
}
}
以下字节码 sn-p 引起了我的注意,似乎不是最佳的
LDC Ljava/lang/String;.class
INVOKEVIRTUAL java/lang/Class.newInstance ()Ljava/lang/Object;
CHECKCAST java/lang/String
问题:
当要执行的方法依赖于对象引用时,使用 InvokeVirtual。鉴于“类”是最终的并且 newInstance() 仅存在 在“类”中,为什么不使用 InvokeSpecial 而不是 InvokeVirtual ?不是更高效吗?
【问题讨论】:
标签: java jvm java-bytecode-asm jvm-hotspot