Java 对象何时完全初始化?

When is a Java object fully initialized?

正如大家所知,刚刚由 new 字节码分配的对象没有被初始化,因此不是 java.lang.Object。如果我进行运行时字节码操作并将该对象提供给方法,JVM 将报错甚至崩溃(因为我提供的 "thing" 不是 java.lang.Object)。

所以,我的问题是,对象 "fully" 何时初始化,即成为 java.lang.Object?是当构造函数(<init>):

从任何给定的 <init> 方法的角度来看,this 值被认为是在调用 invokespecial returns 之后初始化的,无论是调用另一个 <init> 方法在同一个 class 或一个 superclass.

同样,对于使用 new 指令创建的对象,一旦您对它们 invokespecial 一个 <init> 方法,它们就被视为已初始化。

请注意,初始化跟踪对方法而言是局部的。字节码验证是在一个方法一个方法的基础上完成的,每个方法只看到在它内部创建的对象和对方法的调用。如果不调用另一个构造函数就不可能在构造函数中初始化 this 值,这一事实确保它最终会链接到 java.lang.Object 构造函数,除非它抛出或进入无限循环。

这里是一个"Foo"class

方法的字节码
 public <init>()V
   L0
    LINENUMBER 1 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this LFooTest; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

当您尝试创建 Foo 的新实例时,将 INVOKESPECIAL java/lang/Object。 ()V,之后会在堆内存中创建对象,栈中的引用会return赋值给"this"。所以,在我看来,你的问题的答案应该是“在调用 java.lang.Object.init() 之后”[=1​​1=]