static引发的诡异问题

时间:2021-08-31 16:42:42

项目中经常用到Constants变量类,里面的属性的修饰为public final static String。
本例的Constants定义了测试环境和生产环境的一些参数属性,如下:
测试环境:

public class Constants {
public final static String WX_OPEN_APPID = "wxff18b45a413303f7";//测试环境:开放平台AppID
//public final static String WX_OPEN_APPID = "wx630d7795f554888e";//生产环境:开放平台AppID
}

生产环境:

  public class Constants {
//public final static String WX_OPEN_APPID = "wxff18b45a413303f7";//测试环境:开放平台AppID
public final static String WX_OPEN_APPID = "wx630d7795f554888e";//生产环境:开放平台AppID
}

平时部署测试环境的时候,注释掉生产环境变量,打开测试环境变量。
其他一些类会应用到该变量,比如在CommonAction.java的一个方法中:
String openid = WeixinUtil.getComponentOpenid(appid, code,component_access_token, Constants.WX_OPEN _APPID);
将本地编译后的CommonAction.class单独部署到生产环境后,发现WeixinUtil.getComponentOpenid报参数错误异常
后来跟踪日志,发现最后一个参数Constants.WX_OPEN _APPID竟然是“wxff18b45a413303f7”,
反编译生产环境的Constants 发现没有异常: public final static String WX_OPEN_APPID = “wx630d7795f554888e”;// 生产环境:开放平台AppID
好诡异!!!

反编译我部署到生产环境的CommonAction.class,终于真相大白了:

static引发的诡异问题

总结:

java类
String openid = WeixinUtil.getComponentOpenid(appid, code,component_access_token, Constants.WX_OPEN_APPID);

class文件反编译后
String openid = WeixinUtil.getComponentOpenid(appid, code, component_access_token, “wxff18b45a413303f7”);

要修改线上环境的static变量,只替换static变量所在的class文件,是会有问题的。原则上,要将所有使用这个static变量的类都替换掉。
更好的实践,是不要只替换几个类,而是将整份代码都重新编译,重新发布
反之:
如果往服务器上,上传引用常量类的class文件的话,请确保本地编译的static变量是线上环境的变量。