Java 字节码中的#Number 是什么?
What is #Number in Java bytecode?
我像这样写了一个简单的 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、...?
您何时以及为何使用它?
#x
引用 class constant pool 中的一个条目。条目的实际值打印在注释中。
要同时查看常量池,请使用 javap -c -verbose ...
那些#
符号指的是class的常量池,如果你反编译冗长使用
javap -c -s -verbose Main.class
您将在 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
...
我像这样写了一个简单的 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、...?
您何时以及为何使用它?
#x
引用 class constant pool 中的一个条目。条目的实际值打印在注释中。
要同时查看常量池,请使用 javap -c -verbose ...
那些#
符号指的是class的常量池,如果你反编译冗长使用
javap -c -s -verbose Main.class
您将在 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
...