今天在 IDEA 里跑单测时发现一个有趣的现象:我把`POLL_SCHEDULED_AVG_INTERVAL_SEC`这个常量的值从2变为1,图一 Utils 类中 set后的值应该为 1 * 1000 = 1000,debug看却仍然是旧值 2000。打开class文件一看常量值确实变成1,但 Utils 中的代码却是 `p.setPollScheduledAvgIntervalMS(2000)`。原来是 Utils 类没有更新。

分析:我推断IDEA的编译机制应该是仅重新编译有内容变更的文件,以保证编译速度,由于 Utils 类引用是常量,JVM编译存在“常量折叠”优化现象,Utils 类对应的字节码直接使用 2000,而不是动态引用常量类,且 Utils 类没有内容变更,未触发重新编译,因此一直使用的是 2000 这个旧值。

解决:也不用 `mvn clean` 强制全部重编译,直接改动 Utils 类,比如加一行空格,最后再改回来,就可以触发 Utils 类重新编译了。
展开
chen_xi于2024-06-05 02:33发布的图片
chen_xi于2024-06-05 02:33发布的图片
chen_xi于2024-06-05 02:33发布的图片
chen_xi于2024-06-05 02:33发布的图片
评论