Java 对象何时完全初始化?
When is a Java object fully initialized?
正如大家所知,刚刚由 new
字节码分配的对象没有被初始化,因此不是 java.lang.Object
。如果我进行运行时字节码操作并将该对象提供给方法,JVM 将报错甚至崩溃(因为我提供的 "thing" 不是 java.lang.Object
)。
所以,我的问题是,对象 "fully" 何时初始化,即成为 java.lang.Object
?是当构造函数(<init>
):
- 叫什么?
- returns?
- 之前的某个时间 returns?
- 来电
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() 之后”[=11=]
正如大家所知,刚刚由 new
字节码分配的对象没有被初始化,因此不是 java.lang.Object
。如果我进行运行时字节码操作并将该对象提供给方法,JVM 将报错甚至崩溃(因为我提供的 "thing" 不是 java.lang.Object
)。
所以,我的问题是,对象 "fully" 何时初始化,即成为 java.lang.Object
?是当构造函数(<init>
):
- 叫什么?
- returns?
- 之前的某个时间 returns?
- 来电
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() 之后”[=11=]