Java字节码中的#数字是什么?
我编写了一个简单的java源代码,如下所示:Java字节码中的#数字是什么?,java,bytecode,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:
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
}
从“Main.java”编译而来
公共班机{
公用干管();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
3:ldc#3//String你好,世界!
5:invokevirtual#4//方法java/io/PrintStream.println:(Ljava/lang/String;)V
8:返回
}
什么是1、2、3、4、
您何时以及为什么要使用它?该#x
指的是类中的条目。条目的实际值将打印在注释中
要查看常量池,请使用javap-c-verbose…
如果使用
javap -c -s -verbose Main.class
您将在常量池
部分获得它们的定义
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=Methodref#6.#15//java/lang/Object。”“()V
#2=Fieldref#16.#17//
=字符串#18//你好,世界!
#4=Methodref#19.#20//java/io/PrintStream.println:(Ljava/lang/String;)V
#5=类别#21//Main
#6=类#22//java/lang/Object
#7=Utf8
#8=Utf8()V
#9=Utf8代码
#10=Utf8行号表
#11=Utf8主
...