javap可以查看java编译器为我们生成的字节码。 通过它,可以对照源代码和字节码,从而了解很多编译器内部的工作。
package com.ant;
public class HelloWorld{
private String name;
private static final String LANGUAGE = "Java";
public HelloWorld(String name){
this.name = name;
}
public static void main(String[] args){
HelloWorld hw = new HelloWorld("Tom");
hw.sayHelloWorld();
}
public void sayHelloWorld(){
System.out.println(LANGUAGE+": "+name+" , HelloWorld !");
}
}
javap -v com.ant.HelloWorld:
Classfile /D:/com/ant/HelloWorld.class
Last modified 2016-11-1; size 837 bytes
MD5 checksum e5ee3b20c3c6196f835eea02b3777e50
Compiled from "HelloWorld.java"
public class com.ant.HelloWorld
SourceFile: "HelloWorld.java"
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #15.#31 // java/lang/Object."<init>":()V
#2 = Fieldref #3.#32 // com/ant/HelloWorld.name:Ljava/lang/String;
#3 = Class #33 // com/ant/HelloWorld
#4 = String #34 // Tom
#5 = Methodref #3.#35 // com/ant/HelloWorld."<init>":(Ljava/lang/String;)V
#6 = Methodref #3.#36 // com/ant/HelloWorld.sayHelloWorld:()V
#7 = Fieldref #37.#38 // java/lang/System.out:Ljava/io/PrintStream;
#8 = Class #39 // java/lang/StringBuilder
#9 = Methodref #8.#31 // java/lang/StringBuilder."<init>":()V
#10 = String #40 // Java:
#11 = Methodref #8.#41 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#12 = String #42 // , HelloWorld !
#13 = Methodref #8.#43 // java/lang/StringBuilder.toString:()Ljava/lang/String;
#14 = Methodref #44.#45 // java/io/PrintStream.println:(Ljava/lang/String;)V
#15 = Class #46 // java/lang/Object
#16 = Utf8 name
#17 = Utf8 Ljava/lang/String;
#18 = Utf8 LANGUAGE
#19 = Utf8 ConstantValue
#20 = String #47 // Java
#21 = Utf8 <init>
#22 = Utf8 (Ljava/lang/String;)V
#23 = Utf8 Code
#24 = Utf8 LineNumberTable
#25 = Utf8 main
#26 = Utf8 ([Ljava/lang/String;)V
#27 = Utf8 sayHelloWorld
#28 = Utf8 ()V
#29 = Utf8 SourceFile
#30 = Utf8 HelloWorld.java
#31 = NameAndType #21:#28 // "<init>":()V
#32 = NameAndType #16:#17 // name:Ljava/lang/String;
#33 = Utf8 com/ant/HelloWorld
#34 = Utf8 Tom
#35 = NameAndType #21:#22 // "<init>":(Ljava/lang/String;)V
#36 = NameAndType #27:#28 // sayHelloWorld:()V
#37 = Class #48 // java/lang/System
#38 = NameAndType #49:#50 // out:Ljava/io/PrintStream;
#39 = Utf8 java/lang/StringBuilder
#40 = Utf8 Java:
#41 = NameAndType #51:#52 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
#42 = Utf8 , HelloWorld !
#43 = NameAndType #53:#54 // toString:()Ljava/lang/String;
#44 = Class #55 // java/io/PrintStream
#45 = NameAndType #56:#22 // println:(Ljava/lang/String;)V
#46 = Utf8 java/lang/Object
#47 = Utf8 Java
#48 = Utf8 java/lang/System
#49 = Utf8 out
#50 = Utf8 Ljava/io/PrintStream;
#51 = Utf8 append
#52 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
#53 = Utf8 toString
#54 = Utf8 ()Ljava/lang/String;
#55 = Utf8 java/io/PrintStream
#56 = Utf8 println
{
public com.ant.HelloWorld(java.lang.String);
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=2
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field name:Ljava/lang/String;
9: return
LineNumberTable:
line 9: 0
line 10: 4
line 11: 9
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=3, locals=2, args_size=1
0: new #3 // class com/ant/HelloWorld
3: dup
4: ldc #4 // String Tom
6: invokespecial #5 // Method "<init>":(Ljava/lang/String;)V
9: astore_1
10: aload_1
11: invokevirtual #6 // Method sayHelloWorld:()V
14: return
LineNumberTable:
line 13: 0
line 14: 10
line 15: 14
public void sayHelloWorld();
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: new #8 // class java/lang/StringBuilder
6: dup
7: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V
10: ldc #10 // String Java:
12: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: aload_0
16: getfield #2 // Field name:Ljava/lang/String;
19: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: ldc #12 // String , HelloWorld !
24: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: invokevirtual #13 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #14 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: return
LineNumberTable:
line 18: 0
line 19: 33
}
javap -public com.ant.HelloWorld:
Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
public com.ant.HelloWorld(java.lang.String);
public static void main(java.lang.String[]);
public void sayHelloWorld();
}
javap -p com.ant.HelloWorld:
Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
private java.lang.String name;
private static final java.lang.String LANGUAGE;
public com.ant.HelloWorld(java.lang.String);
public static void main(java.lang.String[]);
public void sayHelloWorld();
}
javap -sysinfo com.ant.HelloWorld:
Classfile /D:/com/ant/HelloWorld.class
Last modified 2016-11-1; size 837 bytes
MD5 checksum e5ee3b20c3c6196f835eea02b3777e50
Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
public com.ant.HelloWorld(java.lang.String);
public static void main(java.lang.String[]);
public void sayHelloWorld();
}
javap -c -p com.ant.HelloWorld:
Compiled from "HelloWorld.java"
public class com.ant.HelloWorld {
private java.lang.String name;
private static final java.lang.String LANGUAGE;
public com.ant.HelloWorld(java.lang.String);
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #2 // Field name:Ljava/lang/String;
9: return
public static void main(java.lang.String[]);
Code:
0: new #3 // class com/ant/HelloWorld
3: dup
4: ldc #4 // String Tom
6: invokespecial #5 // Method "<init>":(Ljava/lang/String;)V
9: astore_1
10: aload_1
11: invokevirtual #6 // Method sayHelloWorld:()V
14: return
public void sayHelloWorld();
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: new #8 // class java/lang/StringBuilder
6: dup
7: invokespecial #9 // Method java/lang/StringBuilder."<init>":()V
10: ldc #10 // String Java:
12: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
15: aload_0
16: getfield #2 // Field name:Ljava/lang/String;
19: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
22: ldc #12 // String , HelloWorld !
24: invokevirtual #11 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
27: invokevirtual #13 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
30: invokevirtual #14 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
33: return
}