Java常量初始化后不会再去重新获取

Java虚拟机编译机制:更改常量部分 

最近一个Java项目中需要修改一个静态常量的值,本地修改编译以后调试正常,然后把对应的entity类的class文件上传到服务器对应的目录以后系统依旧我行我素,各种清除缓存,各种重启,最后查询了相关资料,使用GUI反编译工具反编译查看编译后源码,终于找到问题所在: 

***    单纯的修改静态变量是没用的,还要重新编译所有引用静态变量的类,不然不会生效的。 

这里就牵扯到Java虚拟机编译机制:在Java文件中,指向编译时static final的静态常量, 会被在运行时解析为一个局部的常量值(也就是说静态常量在编译后,成为了常量,而不是原先的代码)。这对所有的基础数据类型(就像int ,float等)和java.lang.String都适用。 

例如:

 

public class Contant{
		public static final String STR = "alexgaoyh";
		//...... 
    }

  

然后在某些逻辑代码段里使用了这些常量。这样做可以便于管理常量,避免了大量的magic number/text,在修改常量内容时只需改这一个类就行了。

 

public class TestService {
		public void doSome() {
			//这里应用了上一个类的静态常量Contant.STR
			System.out.println(Contant.STR);
		}
    }

  

类TestService使用了Contant.STR这个常量,表面上是通过Contant类取得的这个值,实际上在TestService被编译后,其代码已经改变为

 

public class TestService {
		public void doSome() {
		//这里把静态常量Contant.STR直接编译成为了一个常量"alexgaoyh"
		System.out.println("alexgaoyh");
		}
	}

  

也就是说    在所有使用常量的地方,都要重新进行编译才能生效。

转载于:https://www.cnblogs.com/owenma/p/6727876.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值