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

发布于 2014-12-08 | 更新于 2020-09-20

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

问题描述如下:

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

对常量问题的思考:

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

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

参考代码:

常量编译处理方式

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

本文作者: arthinking

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

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。