修改了类A的final变量的值,由于类A在jar包中,把修改后的类A编译成的class直接替换了jar包中的类A,类B运行时会调用类A的final值,结果运行类B时总是原来的结果,不是类A修改后的结果.
经过一段时间的代码调试总算找到了原因,原来JVM在编译代码时会把final类型的变量直接编译为静态值,即:类B在代码中是引用类A中final变量的值的关系,但编译为class时会把这个值视为静态的编译到类B中.所以出现了只替换jar中的类A的class得不到想要的结果.想要真正的结果还需要重新编译类B并替换jar中类B的class才行,虽然类B没有修改任何代码但编译后的class是不一样的.
总结一下:修改了final类型的变量值后,所有引用了该变量的类都需要替换.