初始化按需持有者习语 - 什么时候加载类?

时间:2018-05-14 21:15:39

标签: java jvm internals

我一直在关注:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom以了解更多关于单身人士的信息。

我的问题是静态内部类何时获得Loaded以及何时获得Initialised?我的理解是类可以被加载但是在初始化是绝对必要的之前保持未初始化。

如果没有加载类,那么在JVM中如何指定私有静态内部类?

1 个答案:

答案 0 :(得分:2)

初始化类的确切时间在Java® Language Specification, §12.4.1

中指定
  

§12.4.1。初始化发生时

     

类或接口类型T将在第一次出现以下任何一个之前立即初始化:

     
      
  • T是一个类,并创建了T的实例。
  •   
  • 调用static声明的T方法。
  •   
  • 分配了static声明的T字段。
  •   
  • 使用static声明的T字段,该字段不是常量变量(§4.12.4)。
  •   
  • T是一个顶级课程(§7.6)和一个assert语句(§14.10)词汇量嵌套在T§8.1.3)中被执行。
  •   
     

初始化类时,会初始化其超类(如果它们之前未初始化),以及声明任何默认方法(§8.1.5)的任何超接口(§9.4.3)(如果它们以前没有初始化)。接口的初始化本身不会导致其任何超接口的初始化。

最后一个项目已在Java 9中删除

加载的时间不是固定的,可能取决于实现细节,例如:如何验证验证者。但很明显,它必须在初始化之前发生。

从JVM的角度来看,这是一个嵌套类的事实没有特别的相关性。外部类“constant pool中的内部类有一个符号引用,就像任何其他引用的类一样。 ,它将是resolved