之前記錄過jdk9+版本的1個bug,某些情況下會導致方法執行二遍,今天早上打開筆記本(mac),彈出一個框提示jdk升級10.0.2,順手點了一下,然后驗證了下該bug,發現居然fix掉了,推薦大家升級!
還是這段代碼:
public class JavacEvalBug{ private static String[] array = {""}; static int test(){ System.out.println("evaluated!"); return 0; } public static void main(String[] args) { array[test()] += "a"; } }
編譯運行后,只輸出了一次evaluated!,用工具查看字節碼:
javap -verbose JavacEvalBug
(注:jdk 10.0.2 在mac上的安裝路徑為 /Library/Java/JavaVirtualMachines/jdk-10.0.2.jdk/Contents/Home)
輸出如下(僅截取了片段):
public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=4, locals=1, args_size=1 0: getstatic #5 // Field array:[Ljava/lang/String; 3: invokestatic #6 // Method test:()I 6: dup2 7: aaload 8: invokedynamic #7, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String; 13: aastore 14: return LineNumberTable: line 11: 0 line 12: 14
test:() I 這里只調用了1次,這回可以放心使用jdk 10了。順便,附圖一張,jdk近年來更新節奏大提速,從下圖看,10.0.2這個版本到2018-12-16 就過期了(即:又得升級)