常量池知多少——class文件替换无效引发的思考
来源:互联网 发布:分期系统商城源码 编辑:程序博客网 时间:2024/06/05 18:39
终于,经过一次次需求和设计的更改,项目终于快要上线了,兴奋啊,哈哈。咳咳。。。大家记得关注哈。
可是最近几天,我发现了一个特别古怪的问题:
替换掉原先的类文件无效,重启服务器也无效!
ps实际问题:支付的同步通知地址和异步通知地址,是写在一个接口的静态常量里面的,修改该文件后重新部署,重启服务器也无效,项目中应用的还是改动之前的地址。
一般来说,我们更新网站,就是把更新后的文件,如jsp、class文件,替换掉原先的class文件即可。服务器如Tomcat,会自动为我们完成热部署。如果内存有溢出的话,重启一下服务器就OK了。可是今天,我却发现,替换之后的class文件,无论如何也不生效。
想了很多种可能:Tomcat里面配置自动解析WAR包的配置会不会有影响(项目非war包)?Tomcat里面web.xml相关模式是否有影响?……
弄了半天,修改后的class文件仍然无法起作用。
后来终于在吃饭ing找到问题的原因了(人是铁,饭是钢,说的果然没错)。
被修改的类文件,并不同普通的类文件,而是一个接口里面的静态常量。而在Java中,对常量和变量的处理是不一样的。常量是在编译期就已经确定的。也就是说:项目在经javac编译成class文件后,常量在应用中不是以常量名的形式存在的,而是以常量值的形式存在。
举个简单的例子:
我在修改之前的常量是这样:
- public interface Constant {
- public static String notify ="www.baidu.com";
- }
修改之后是这样:
- public interface Constant {
- public static String notify ="http://www.google.com.hk/";
- }
而在程序中,我们这样使用常量:Constant.notify
可是,在java中编译之后,使用该常量的地方都变成了:www.baidu.com.
所以,我只是替换我更改后的常量类,项目中使用常量的地方,并没有改变,仍然是www.baidu.com
我们都知道,java是在运行期对类进行装载的,所以,它总是会访问到最新版本的类。但是,对于常量域的引用,会在编译期被转化为它表示的值。所以,也就出现了今天的问题。
所以说,静态常量,我们使用时一定要慎重。一旦有修改就需要将整个项目重新编译替换。
那么,我又有问题了:如果我现在将上面的常量设置为null,只替换这个文件会怎么样呢?
也即是如下:
- public interface Constant {
- public static String notify =null;
- }
替换后,也会出现上面的情况吗?
答案应该是替换后的null(未经尝试,大家可以自己试一下)。原因也跟Java的设计者有关系。- 常量池知多少——class文件替换无效引发的思考
- 常量池知多少——class文件替换无效引发的思考
- const_cast引发的常量折叠思考
- 一个字符串常量实验引发的思考
- JDBC Class.forName引发的思考
- class文件常量池
- JVM进阶(十九)——Class文件常量池
- delete this——引发的思考
- 解析class文件常量池
- class文件中的常量池
- 头文件保护符引发的思考
- 更换class文件引发的问题
- eclipse新建.dic文件注意——由使用IKAnalyzer分词器新建ext.dic文件引发的思考
- 一个例子引发的思考——C++内存地址
- 学习效率感想——博客引发的思考
- 沧海拾贝——一个递归引发的思考
- 一道习题引发的思考——Java字符运算
- 阿里巴巴笔试—— 一道动规引发的思考
- http://www.cnblogs.com/sunzn/archive/2013/05/10/3064129.html
- 【Head First设计模式-读书笔记】装饰者模式
- sql server学习笔记
- canvas标签的width和height以及style.width和style.height的区别
- 不算清楚这些成本,不要轻易跳槽!
- 常量池知多少——class文件替换无效引发的思考
- Win2008下expdp和rman备份策略及计划任务配置
- 浏览器缓存知识
- ORA-00020: maximum number of processes () exceeded, sqlplus / as sysdba无法登陆
- 探索工作流(二)--状态工作流 My Workflow Trip
- Perl 与 Python 之间的一些异同
- java的commons包的简介
- 看别人的成功,走自己的想要的路
- virsh命令行管理工具