【发布时间】:2018-04-07 20:11:18
【问题描述】:
我是Java字节码的新手,想了解下面Dispatch.class相对于下面Dispatch.java源代码的字节码:
Compiled from "Dispatch.java"
class Dispatch {
Dispatch();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class B
3: dup
4: invokespecial #3 // Method B."<init>":()V
7: astore_1
8: aload_1
9: invokevirtual #4 // Method A.run:()V
12: return
}
//=====================Dispatch.java==============================
class Dispatch{
public static void main(String args[]){
A var = new B();
var.run(); // prints : This is B
}
}
//======================A.java===========================
public class A {
public void run(){
System.out.println("This is A");
}
}
//======================B.java===========================
public class B extends A {
public void run(){
System.out.println("This is B");
}
}
在网上阅读了一些资料后,我初步了解了 JVM 堆栈和操作码的工作原理。但是,我仍然不明白这些命令行有什么好处:
3: dup //what are we duplicating here exactly?
4: invokespecial #3 //what does the #3 in operand stand for?
invokevirtual VS invokespecial //what difference there is between these opcodes?
【问题讨论】:
-
你做了哪些研究?您有什么具体想解释的吗?
-
@Antimony 线程已更新
-
参见
invokespecialinstruction 和Compiling for the Java Virtual Machine → Working with Class Instances,specification 应有尽有。到目前为止,无论您在研究过程中读到什么,如果它不能解释这些事情,那都是不值得的。
标签: java polymorphism bytecode late-binding