class 使用 上一个 所在 服务器 ber 反编译 word
Java 虚拟机编译机制: 更改常量部分 最近一个 Java 项目中需要修改一个静态常量的值,本地修改编译以后调试正常,然后把对应的 entity 类的 class 文件上传到服务器对应的目录以后系统依旧我行我素,各种清除缓存,各种重启,最后查询了相关资料,使用 GUI 反编译工具反编译查看编译后源码,终于找到问题所在: *** 单纯的修改静态变量是没用的,还要重新编译所有引用静态变量的类,不然不会生效的。 这里就牵扯到 Java 虚拟机编译机制:在 Java 文件中,指向编译时 static final 的静态常量, 会被在运行时解析为一个局部的常量值(也就是说静态常量在编译后,成为了常量,而不是原先的代码)。这对所有的基础数据类型(就像 int ,float 等)和 java.lang.String 都适用。
例如:
- publicclass Contant{publicstaticfinal String STR ="alexgaoyh";//......
- }
然后在某些逻辑代码段里使用了这些常量。这样做可以便于管理常量,避免了大量的 magic number/text,在修改常量内容时只需改这一个类就行了。
- publicclassTestService {public void doSome() {//这里应用了上一个类的静态常量Contant.STR
- System.out.println(Contant.STR);
- }
- }
类 TestService 使用了 Contant.STR 这个常量,表面上是通过 Contant 类取得的这个值,实际上在 TestService 被编译后,其代码已经改变为
- publicclassTestService {public void doSome() {//这里把静态常量Contant.STR直接编译成为了一个常量"alexgaoyh"
- System.out.println("alexgaoyh");
- }
- }
也就是说 在所有使用常量的地方,都要重新进行编译才能生效。
Java 常量初始化后不会再去重新获取
来源: http://www.bubuko.com/infodetail-2030912.html