Java 在JVM中加载类时,类的不同部分以什么顺序初始化?
想象一个Java类,它具有在类中可以找到的大多数特性。例如:它从另一个类继承,实现了几个接口,包括一些“静态最终”常量、一些最终常量、一些静态变量、实例变量、一个静态块、一个未命名的代码块(只是{}中的代码)、构造函数、方法等 当所讨论的类第一次加载到JVM中时,类的各个部分以什么顺序初始化或加载到JVM中?JVM中的调用堆栈在加载时是什么样子的?假设这里只有一个类加载器在工作Java 在JVM中加载类时,类的不同部分以什么顺序初始化?,java,class,initialization,classloader,Java,Class,Initialization,Classloader,想象一个Java类,它具有在类中可以找到的大多数特性。例如:它从另一个类继承,实现了几个接口,包括一些“静态最终”常量、一些最终常量、一些静态变量、实例变量、一个静态块、一个未命名的代码块(只是{}中的代码)、构造函数、方法等 当所讨论的类第一次加载到JVM中时,类的各个部分以什么顺序初始化或加载到JVM中?JVM中的调用堆栈在加载时是什么样子的?假设这里只有一个类加载器在工作 这要回到Java的绝对基础/内部,但我还没有找到一篇好文章来解释正确的顺序。关于第12.4节的内容如何?这可以在本节中
这要回到Java的绝对基础/内部,但我还没有找到一篇好文章来解释正确的顺序。关于第12.4节的内容如何?这可以在本节中描述 2.17.4初始化 类的初始化包括:
- 执行其静态初始值设定项(§2.11)和
- 类中声明的静态字段(§2.9.2)的初始值设定项李>
- T是一个类,并且创建了T的一个实例
- T是一个类,调用了T的静态方法
- 使用或指定了一个T的非恒定静态场。常量字段是(显式或隐式)最终和静态字段,并用编译时常量表达式的值初始化。对此类字段的引用必须在编译时解析为编译时常量值的副本,因此使用此类字段不会导致初始化李>
的更新版本 类或接口的初始化包括执行其类或接口初始化方法() 类或接口只能在以下情况下初始化:
- 执行引用类或接口(,)的Java虚拟机指令
、new
、getstatic
、或putstatic
。invokestatic
所有这些指令都通过字段引用或方法引用直接或间接引用类。
在执行新指令时,如果引用的类或接口尚未初始化,则该类或接口将被初始化。
执行
、getstatic
或putstatic
指令后,如果声明已解析字段或方法的类或接口尚未初始化,则该类或接口将被初始化invokestatic
实例的第一次调用,该实例是java虚拟机()解析方法句柄的结果,其类型为2(java.lang.invoke.MethodHandle
)、4(REF\u getStatic
)、6(REF\u putStatic
)或8(REF\u invokeStatic
)REF\u newInvokeSpecial
- 调用类库()中的某些反射方法,例如,在class
或包class
中java.lang.reflect
- 它的一个子类的初始化
- 它被指定为Java虚拟机启动()的初始类
类或接口的初始化也可能作为该类或接口初始化的一部分递归地请求 Java虚拟机的实现负责使用以下过程进行同步和递归初始化。
它假设
类
对象已经过验证和准备,并且类
对象包含表示以下四种情况之一的状态:
- 此
对象已验证并准备好,但尚未初始化类
- 这个
对象正由某个特定线程初始化类
- 此
对象已完全初始化并准备好使用类
- 这个
对象可能处于错误状态类