在阅读这个问题的答案时,我想知道 Java7 引导程序如何知道public static void main(String[] args)
方法的存在,而不运行静态初始化程序?我对这个话题有一些假设,但其中一些显然是错误的:
- Java Bootstrap 运行在 JVM 中,所以它只能使用标准的 JVM 特性(没有原生特性)——例如,被调用的类必须在 CLASSPATH 上
- 标准的 JVM 类加载是通过普通的类加载机制完成的(我知道它有几个步骤,我已经玩过几次类加载器了)
- 类被解析(链接)后,立即运行类初始化(包括初始化静态属性和运行静态初始化程序)
- 没有办法分开前两个步骤
我的问题是:
- 谁调用类初始值设定项以及在哪个阶段?(之前发生了什么,之后发生了什么?)
- 为什么引导程序的行为与“正常”类加载不同?在这方面还有更多不同吗?
- 额外的问题:我的哪个假设是错误的?
总结提到的问题:如果您运行 Java 主类(从 Java7 命令行),它将检查main()
方法的存在,而不运行静态初始化程序。在 Java6 中,它的行为有所不同。