我一直在尋找到下面的java程序調用class.NewInstance()時爲什麼調用虛擬代替InvokeSpecial?
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使用當要執行的方法依賴於對象引用時。鑑於「類」是final,newInstance()在「Class」中只存在 ,爲什麼不使用InvokeSpecial而不是InvokeVirtual?它不會更高性能嗎?
特別是'Class'是'final',所以唯一的虛擬方法是對父類方法的調用。 –
我做了一個編輯。 InvokedDynamic是一個錯字。我打算說InvokeVirtual。 – KodeWarrior
我沒有查看InvokeSpecial的文檔。我也檢查了InvokeVirtual https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokevirtual 調用實例方法;基於類的派遣 仍然不明白爲什麼在這裏使用invokevirtual給定的類是final的。 可能的答案可能是InvokedSpecial操作碼只能用於相同/超類的方法。 – KodeWarrior