2016-01-02 43 views
3

我寫了一個簡單的Java源是這樣的:什麼是Java字節碼中的#號?

public class Main {  
    public static void main(String[] args) { 
     System.out.println("Hello World!"); 
    } 
} 

,並將其轉換爲與所述的javap -c命令

Compiled from "Main.java" 
public class Main { 
    public Main(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #3     // String Hello World! 
     5: invokevirtual #4     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return 
} 

哪些#1,#2中的等效字節碼,#3, #4,...?

何時和爲什麼要使用它?

回答

4

那些#符號引用類的常量池,你會得到他們的定義在Constant pool部分

Constant pool: 
#1 = Methodref   #6.#15   // java/lang/Object."<init>"()V 
#2 = Fieldref   #16.#17  // 
= String    #18   // Hello World! 
#4 = Methodref   #19.#20  // java/io/PrintStream.println:(Ljava/lang/String;)V 
#5 = Class    #21   // Main 
#6 = Class    #22   // java/lang/Object 
#7 = Utf8    <init> 
#8 = Utf8    ()V 
#9 = Utf8    Code 
#10 = Utf8    LineNumberTable 
#11 = Utf8    main 
... 
1

#x是指類constant pool中的條目。條目的實際值將打印在評論中。

,如果你反編譯冗長使用

javap -c -s -verbose Main.class 

也查看常量池使用javap -c -verbose ...