你知道升级到JDK9时的错误吗?很有意思,分享给大家,希望大家在升级JDK版本的时候注意一下是否有这样的代码,如果有记得马上改掉。输出更有趣。JDK9之前只输出一个evaluated,JDK9之后的版本会输出两个evaluated。你可以测试一下。猜测见此现象,众人纷纷开始猜测。首先,是编译时的问题还是运行时的问题?这是一个很好的验证。我们用JDK8编译的类分别在JDK8和JDK10上运行,看看有没有类似的现象。其次,如果是编译时的问题,有什么区别?综上所述,对于JDK10编译的字节码,该测试方法肯定可以执行两次。大家验证了第一种情况下没有类似的问题,所以基本可以确定是第二种情况,接下来简单分析一下。简单分析验证字节码,我们都是通过javap看的,javap-verboseJavacEvalBug,在两个版本下,可以看到下面的字节码JDK8编译的字节码基本等同于下面的逻辑JDK10编译的字节码是比较清楚。在JDK10编译的字节码中,确实看到test方法执行了两次,与结论相符。这个bug已经上报给Oracle,https://bugs.openjdk.java.net/browse/JDK-8204322,大家可以关注进度,点击原文进入BUG链接。思维发散其实涉及到字符串拼接。JDK9以前使用StringBuilder拼接,JDK9开始使用invokeDynamic命令,可以动态指定调用的方法,不用一开始就编译。这就展开了说来话长。如果你有兴趣,你可以在网上找一些资料。有时间我也可以写一篇相关的文章。只是觉得对这块比较感兴趣或者有兴趣看的人不会太多。许多。换个Demo再给你惊喜。如果把上面的Demo改成数组改成int数组,可以再试试?【本文为专栏作家李嘉鹏原创文章,转载请微信公众号(你个假笨蛋,id:lovestblog)联系作者授权转载】点此查看本作者更多好文
