나는 다음과 같은 자바 프로그램class.NewInstance()를 호출 할 때 InvokeSpecial 대신 InvokeVirtual이 사용되는 이유는 무엇입니까?
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 사용 실행될 메소드가 객체 참조에 의존 할 때. "Class"는 final이며 newInstance()는 "Class"에 만 존재하므로 InvokeVirtual 대신 InvokeSpecial을 사용하지 않는 이유는 무엇입니까? 더 많은 공연을하지 않겠습니까?
특히'Class'는'final'이므로 유일한 가상 메소드는 부모 클래스 메소드 호출입니다. –
나는 편집을했다. InvokedDynamic은 오타였습니다. 나는 InvokeVirtual을 말하려고했다. – KodeWarrior
InvokeSpecial의 설명서를 확인했습니다. 또한 InvokeVirtual을 확인했습니다. https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.invokevirtual 인스턴스 메소드를 호출합니다. 클래스를 기반으로 디스패치 주어진 클래스가 여기에 invokevirtual이 사용 된 이유를 여전히 이해할 수 없습니다. InvokedSpecial opcode가 같은/super 클래스의 메서드에서만 작동 할 수 있다고 대답 할 수 있습니다. – KodeWarrior