描述:
由于对线上环境的修改,如果针对1-2个class文件的修改,就直接替换编译后的class文件。于是在更改了某个文件的一个变量之后,下意识的去编译,然后升级。
然后发现修复的bug并没有被fix。头大之后静下来看代码。发现了自己犯蠢了。
问题:
public final static String URL19E="***************"; ①
public final static String URL19E="###############"; ②
由①改到②,仅此一个小小的修改。
问题就出在这个final;
代码:
FinalTest1.java
public class FinalTest {
public final static String URL = "********";
public static void main(String[] args) {
System.out.println(URL);
}
}
FinalTest1.class
public class FinalTest {
public static final String URL = "********";
public FinalTest() {
}
public static void main(String[] args) {
System.out.println("********");
}
}
我们可以看到,final变量在class文件中已经被替换,final修饰的变量在编译期就决定确定值了。
同理如果直接替换class文件,如果在其他的文件中引用的URL变量,还是之前的替换后的字符串。所以如果要替换class文件,则所有引用的class都需要被替换。