java - JVM静态初始化
问题描述
语言:java
版本:12.0.2
字符串源代码如下:
/* @implNote
* The actual value for this field is injected by JVM. The static
* initialization block is used to set the value here to communicate
* that this static final field is not statically foldable, and to
* avoid any possible circular dependency during vm initialization.
*/
static final boolean COMPACT_STRINGS;
static {
COMPACT_STRINGS = true;
}
如何理解这句话:'静态初始化块用于在此处设置值以传达此静态最终字段不可静态折叠,并避免在vm初始化期间任何可能的循环依赖。
解决方案
这是 JVM 实现者的实现说明。它不是公共文档的一部分,对于使用java.lang.String
.
但如果你想知道:
想象他们写过:
static final boolean COMPACT_STRINGS = true;
那么它就是一个常量,编译器可以用true
任何COMPACT_STRINGS
使用的值替换它(仅在java.lang
包中,因为它是包本地范围的变量)
通过在静态初始化程序中给它值true
,编译器不再知道它是一个常量,所有使用它的代码都必须查找它在运行时具有的实际值。
在这种情况下,这很有用,因为 JVM 在运行时会更改此值(即使它是final
,JVM 仍然可以更改它),正如实现说明所述。
推荐阅读
- javascript - 带有 javascript 图表的 asp-classic
- spring-boot - 如何在 Spring Boot REST Junit 测试用例中注入具有多个对象的 MockMvc
- mysql - 将 {_stack: [ array ]} 获取到要放入 mysql 数据库的字符串
- java - 使用 Socket 将 PHP 脚本连接到 Java
- firebase - 在 Unity 中激活 Firebase 事件 DebugView
- php - 使用 Curl POST 请求 PHP
- ajax - 制表器:通过 Ajax 加载 Google 表格数据
- docusignapi - Docusign API - 为 HTML 文档设置边距
- node.js - 函数中的Nodejs更新请求不起作用
- c++ - 无法在 Windows 10 上将 CLion 链接到 QT