构造函数字节码

rap*_*apt 2 java bytecode-manipulation java-bytecode-asm jvm-bytecode

ASM引导谈到构造函数:

package pkg;
public class Bean {
  private int f;
  public int getF() {
      return this.f;
  }
  public void setF(int f) {
      this.f = f;
  }
}
Run Code Online (Sandbox Code Playgroud)

Bean类还具有由编译器生成的默认公共构造函数,因为程序员没有定义任何显式构造函数。此默认的公共构造函数生成为 Bean() { super(); }。该构造函数的字节码如下:

ALOAD 0
INVOKESPECIAL java/lang/Object <init> ()V
RETURN
Run Code Online (Sandbox Code Playgroud)

第一条指令压this入操作数堆栈。第二条指令从堆栈中弹出该值,并调用类中<init> 定义的方法Object。这对应于super() 调用,即对超类的构造函数的调用Object。您可以在此处看到,在编译类和源类中,构造函数的名称不同:在编译类中,它们总是命名为<init>,而在源类中,它们具有定义它们的类的名称。最后,最后一条指令返回给调用者。

this在构造函数的第一条指令之前,JVM已知的值如何?

Lou*_*man 5

在JVM级别上,首先将对象分配,未初始化,然后在该对象上调用构造函数。构造函数或多或少是在未初始化对象上执行的实例方法。

即使使用Java语言,它也this存在,并且其所有字段都位于构造函数的第一行。