更新常量类导致的编译问题

发布于 2014-12-08 | 更新于 2025-06-14

类从被加载到JVM内存开始,到卸载出内存,整个周期包括:加载、验证、准备、解析、初始化、使用和卸载。而虚拟机规范严格规定了有且只有五种情况必须对类进行初始化(link),这几种情况被称为对类的主动引用,其他的情况被称为被动引用(link),其中就包括调用一个类的常量,不会触发定义常量的类的初始化,这是因为常量(字符串类型或基本数据类型)在编译阶段会存入调用类的常量池中。

问题描述如下:

更新一个常量类class到服务器之后,其他引用这个常量的地方并没有做出改动,导致问题的出现。

对常量问题的思考:

一般在系统运行事情不会发生变化的东西才可以定义为常量,常量可以硬编码写到代码里面。

对于可能做出调整的常量需要考虑:为了方便编译,不用全局编译一次,哪里用到的常量就定义在哪个类中,或者使用枚举类型替换。

参考代码:

常量编译处理方式

可以发现,数组常量会从所在的类加载元素,而字符串和整型的常量会直接在常量池中保存一份数据,不会除非常量所在类的初始化。

本文作者: arthinking

本文链接: https://www.itzhai.com/the-compilation-problems-caused-by-constant.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请订阅本站。

×
帅旋DevShow

订阅及时获取网站内容更新。

充电

当前电量:100%

帅旋DevShow

订阅我,及时获取网站内容更新。