【发布时间】:2018-10-24 15:11:55
【问题描述】:
我一直在看:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom 以了解更多关于单身人士的信息。
我的问题是静态内部类究竟什么时候被加载,什么时候被初始化?我的理解是可以加载类,但在绝对需要初始化之前保持未初始化。
如果类没有加载,JVM内部如何指定私有静态内部类?
【问题讨论】:
我一直在看:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom 以了解更多关于单身人士的信息。
我的问题是静态内部类究竟什么时候被加载,什么时候被初始化?我的理解是可以加载类,但在绝对需要初始化之前保持未初始化。
如果类没有加载,JVM内部如何指定私有静态内部类?
【问题讨论】:
类初始化的确切时间,在Java® Language Specification, §12.4.1中指定
§12.4.1。初始化发生时
类或接口类型 T 将在以下任何一项第一次出现之前立即初始化:
T是一个类,并创建了一个T的实例。- 调用
T声明的static方法。- 分配了
T声明的static字段。- 使用了由
T声明的static字段,并且该字段不是常量变量(§4.12.4)。T是一个顶级类 (§7.6),并且在T(§8.1.3) 中的词法嵌套的assert语句 (§14.10) 被执行。当一个类被初始化时,它的超类被初始化(如果它们之前没有被初始化),以及声明任何默认方法(§9.4.3)的任何超接口(@987654326@)(如果它们之前没有被初始化)初始化)。接口的初始化本身不会导致其任何超接口的初始化。
Java 9 中的最后一个项目符号已被删除
类加载的时间不是固定的,可能取决于实现细节,例如验证器是如何实现的。但显然,它必须发生在初始化之前。
从 JVM 的角度来看,这是一个嵌套类这一事实并没有什么特别的意义。在外部类 constant pool 中有一个对内部类的符号引用,就像任何其他引用的类一样。需要时将是resolved。
【讨论】:
defineClass 方法之一。从那里开始,JVM 实现接管。