java - Java 对象何时完全初始化?

标签 java jvm bytecode bytecode-manipulation

正如人们所知,new 刚刚分配的对象字节码未初始化,因此不是 java.lang.Object .如果我进行运行时字节码操作并将该对象提供给方法,JVM 会报错甚至崩溃(因为我提供给它的“东西”不是 java.lang.Object )。

因此,我的问题是,对象何时“完全”初始化,即变为 java.lang.Object ?是当构造函数( <init> ):

  • 叫什么?
  • 返回?
  • 在它回来之前的某个时间?
  • 调用 java.lang.Object.<init>
  • 其他时间?

最佳答案

从任何给定的角度<init>方法,this在调用 invokespecial 之后,值被认为已初始化返回,是否正在调用另一个 <init>同一个类或父类(super class)中的方法。

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

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

关于java - Java 对象何时完全初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48981711/

相关文章:

java - Architexa 不起作用(无法加载类 com.architexa.diagrams.editors.RSEMultiPageEditor)

java - 按钮不创建文件并在按下时显示电子邮件提供商选项菜单

java - 为什么 @Query 注解的方法需要主体?

java - 为什么 Java 运行时在 SSL 信任存储的工作方式以及我们如何处理它方面存在如此大的差异?

java - 确定是否使用最后一个参数

llvm - 编写llvm字节码

Java-Scanner 不适用于 nextByte()

Java 1.4 类在 1.5 JVM 上的性能

java - 即使在 putty 终端关闭后运行 java 程序

java - 尝试重新定义 sun.reflect.GenerateMethodAccessor1 时 ByteBuddy 失败