相關學習推薦:java基礎教程
下面有段簡單的代碼
public class StringPlusTest{ public static void main(String[] args) { String s1 = "aaa"; String s2 = "bbb"; String s = "ccc" +s1 + s2 +"ddd"; }}
使用 javap -c .StringPlusTest.class
反編譯一下,得到
Compiled from "StringPlusTest.java"public class com.epoint.codetuning.test.StringPlusTest { public com.epoint.codetuning.test.StringPlusTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: ldc #2 // String aaa 2: astore_1 3: ldc #3 // String bbb 5: astore_2 6: new #4 // class java/lang/StringBuilder 9: dup 10: invokespecial #5 // Method java/lang/StringBuilder."<init>":()V 13: ldc #6 // String ccc 15: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 18: aload_1 19: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 22: aload_2 23: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 26: ldc #8 // String ddd 28: invokevirtual #7 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 31: invokevirtual #9 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 34: astore_3 35: return}
其中,
ldc 把常量池中的項壓入棧 astore_1 將引用類型或returnAddress類型值存入局部變量1 astore_2 將引用類型或returnAddress類型值存入局部變量2 new 創(chuàng)建一個新對象 dup 復制棧頂部一個字長內容 invokespecial 根據(jù)編譯時類型來調用實例方法 aload_1 從局部變量1中裝載引用類型值 aload_2 從局部變量2中裝載引用類型值 astore_3 將引用類型或returnAddress類型值存入局部變量3