今天由于基础知识的问题,踩到一个坑。
我编写了一个mqttclient.jar,提供给第三方系统接入使用,mqttclient.jar内部使用了public static final的常量,当第三方需要的时候,传入。
第三方也是将他们编写的程序打成了jar包来执行,会引用我提供的mqttclient.jar
因为我后期程序变更,修改了jar包中的一个常量,但没有告知第三方开发人员,觉得不会有影响,便直接把最新的jar给出,
此时第三方直接将新的mqttclient.jar覆盖原来的,并没有重新打包他们的程序,
所以第三方的程序中的常量还是保持了原来的常量值,与此时jar包内部的不一致,导致问题的发生。
static主要作用是在类刚加载时就初始化该量的值并给他分配一块共用的内存块存储他的值.
自己写了一个demo复现了以上过程:
1. 模拟第三方,编写程序,调用mqttclient.jar中的常量:
public static void main(String[] args) throws Exception { System.out.println("我是mqttclient.jar中的常量:" + MqttClient.REQTYPE_INSIGHT); }
2. 将该简单的main方法工程打包成一个test.jar,部署在服务器执行
3. 删除引用的mqttclient.jar,执行test.jar,执行后,常量值仍然是1802
4. 反编译test.jar发现:
5. 去掉final关键字后,编译test.jar,发现: