javap -v
命令用于查看 Java 类文件的详细信息,包括类的结构、字段、方法、属性、注解等。下面是一个详细的示例,演示如何使用 javap -v
命令来查看类的详细信息:
假设我们有一个名为 Person
的 Java 类,它如下所示:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void displayInfo() {
System.out.println("Name: " + name);
System.out.println("Age: " + age);
}
}
我们首先需要编译这个类,以生成 Person.class
文件:
javac Person.java
接下来,我们可以使用 javap -v
命令来查看 Person.class
文件的详细信息。以下是示例用法和输出:
javap -v Person.class
C:\Minecloud\IDEA_workspace\jvm01\src\main\java\com\wsd>javac Person.java
C:\Minecloud\IDEA_workspace\jvm01\src\main\java\com\wsd>javap -v Person.class
Classfile /C:/Minecloud/IDEA_workspace/jvm01/src/main/java/com/wsd/Person.class
Last modified 2023年9月21日; size 1042 bytes
SHA-256 checksum ca81b253d43f0bafe6d0056821fa5aeb4e37918e6c10faba6408c0143d25732c
Compiled from "Person.java"
public class com.wsd.Person
minor version: 0
major version: 61
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
this_class: #8 // com/wsd/Person
super_class: #2 // java/lang/Object
interfaces: 0, fields: 2, methods: 2, attributes: 3
Constant pool:
#1 = Methodref #2.#3 // java/lang/Object."<init>":()V
#2 = Class #4 // java/lang/Object
#3 = NameAndType #5:#6 // "<init>":()V
#4 = Utf8 java/lang/Object
#5 = Utf8 <init>
#6 = Utf8 ()V
#7 = Fieldref #8.#9 // com/wsd/Person.name:Ljava/lang/String;
#8 = Class #10 // com/wsd/Person
#9 = NameAndType #11:#12 // name:Ljava/lang/String;
#10 = Utf8 com/wsd/Person
#11 = Utf8 name
#12 = Utf8 Ljava/lang/String;
#13 = Fieldref #8.#14 // com/wsd/Person.age:I
#14 = NameAndType #15:#16 // age:I
#15 = Utf8 age
#16 = Utf8 I
#17 = Fieldref #18.#19 // java/lang/System.out:Ljava/io/PrintStream;
#18 = Class #20 // java/lang/System
#19 = NameAndType #21:#22 // out:Ljava/io/PrintStream;
#20 = Utf8 java/lang/System
#21 = Utf8 out
#22 = Utf8 Ljava/io/PrintStream;
#23 = InvokeDynamic #0:#24 // #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;
#24 = NameAndType #25:#26 // makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;
#25 = Utf8 makeConcatWithConstants
#26 = Utf8 (Ljava/lang/String;)Ljava/lang/String;
#27 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V
#28 = Class #30 // java/io/PrintStream
#29 = NameAndType #31:#32 // println:(Ljava/lang/String;)V
#30 = Utf8 java/io/PrintStream
#31 = Utf8 println
#32 = Utf8 (Ljava/lang/String;)V
#33 = InvokeDynamic #1:#34 // #1:makeConcatWithConstants:(I)Ljava/lang/String;
#34 = NameAndType #25:#35 // makeConcatWithConstants:(I)Ljava/lang/String;
#35 = Utf8 (I)Ljava/lang/String;
#36 = Utf8 (Ljava/lang/String;I)V
#37 = Utf8 Code
#38 = Utf8 LineNumberTable
#39 = Utf8 displayInfo
#40 = Utf8 SourceFile
#41 = Utf8 Person.java
#42 = Utf8 BootstrapMethods
#43 = MethodHandle 6:#44 // REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Lja
va/lang/Object;)Ljava/lang/invoke/CallSite;
#44 = Methodref #45.#46 // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)L
java/lang/invoke/CallSite;
#45 = Class #47 // java/lang/invoke/StringConcatFactory
#46 = NameAndType #25:#48 // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
#47 = Utf8 java/lang/invoke/StringConcatFactory
#48 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
#49 = String #50 // Name: \u0001
#50 = Utf8 Name: \u0001
#51 = String #52 // Age: \u0001
#52 = Utf8 Age: \u0001
#53 = Utf8 InnerClasses
#54 = Class #55 // java/lang/invoke/MethodHandles$Lookup
#55 = Utf8 java/lang/invoke/MethodHandles$Lookup
#56 = Class #57 // java/lang/invoke/MethodHandles
#57 = Utf8 java/lang/invoke/MethodHandles
#58 = Utf8 Lookup
{
public com.wsd.Person(java.lang.String, int);
descriptor: (Ljava/lang/String;I)V
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=3, args_size=3
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: aload_1
6: putfield #7 // Field name:Ljava/lang/String;
9: aload_0
10: iload_2
11: putfield #13 // Field age:I
14: return
LineNumberTable:
line 8: 0
line 9: 4
line 10: 9
line 11: 14
public void displayInfo();
descriptor: ()V
flags: (0x0001) ACC_PUBLIC
Code:
stack=2, locals=1, args_size=1
0: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;
3: aload_0
4: getfield #7 // Field name:Ljava/lang/String;
7: invokedynamic #23, 0 // InvokeDynamic #0:makeConcatWithConstants:(Ljava/lang/String;)Ljava/lang/String;
12: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
15: getstatic #17 // Field java/lang/System.out:Ljava/io/PrintStream;
18: aload_0
19: getfield #13 // Field age:I
22: invokedynamic #33, 0 // InvokeDynamic #1:makeConcatWithConstants:(I)Ljava/lang/String;
27: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
30: return
LineNumberTable:
line 14: 0
line 15: 15
line 16: 30
}
SourceFile: "Person.java"
BootstrapMethods:
0: #43 REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/Ca
llSite;
Method arguments:
#49 Name: \u0001
1: #43 REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/Ca
llSite;
Method arguments:
#51 Age: \u0001
InnerClasses:
public static final #58= #54 of #56; // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
C:\Minecloud\IDEA_workspace\jvm01\src\main\java\com\wsd>