Java教程-理解javap工具

理解javap工具
javap命令用于反汇编类文件。javap命令显示类文件中的字段、构造函数和方法的信息。
使用javap工具的语法
让我们看看如何使用javap工具或命令。
javap fully_class_name
使用javap工具的示例
javap java.lang.Object
输出:
Compiled from "Object.java"
public class java.lang.Object {
public java.lang.Object();
public final native java.lang.Class<?> getClass();
public native int hashCode();
public boolean equals(java.lang.Object);
protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;
public java.lang.String toString();
public final native void notify();
public final native void notifyAll();
public final native void wait(long) throws java.lang.InterruptedException;
public final void wait(long, int) throws java.lang.InterruptedException;
public final void wait() throws java.lang.InterruptedException;
protected void finalize() throws java.lang.Throwable;
static {};
}
使用javap工具的另一个示例
让我们为我们的Java文件使用javap命令。
文件名:Simple.java
class Simple{
public static void main(String args[]){
System.out.println("hello java");
}
}
现在让我们使用javap工具来反汇编类文件。
javap Simple
输出:
Compiled from "Simple.java"
class Simple {
Simple();
public static void main(java.lang.String[]);
}
javap -c命令
您可以使用javap -c命令查看反汇编的代码。该代码反映了Java字节码。
javap -c Simple
输出:
Compiled from "Simple.java"
class Simple {
Simple();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()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 java
5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
javap工具的选项
javap工具的重要选项如下。
Option | Description |
---|---|
-help | 打印帮助信息。 |
-l | 打印行号和局部变量 |
-c | 反汇编代码 |
-s | 打印内部类型签名 |
-sysinfo | 显示系统信息(路径、大小、日期、MD5 哈希) |
-constants | 显示静态最终常量 |
-version | 显示版本信息 |
让我们通过一个示例来看如何使用这些选项。对于以下文件(ABC.java),我们将使用上述选项。
文件名:ABC.java
public class ABC
{
// main method
public static void main(String argvs[])
{
// declaring an integer array
int arr[] = {6, 7, 8, 6, 8, 0, 4};
// caculating size of the array
int size = arr.length;
// printing size of the array
System.out.println("The size of the array is " + size );
System.out.println("The 8th index of the array is " + arr[8] );
}
}
命令:javap -c ABC
输出:
Compiled from "ABC.java"
public class ABC {
public ABC();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 7
2: newarray int
4: dup
5: iconst_0
6: bipush 6
8: iastore
9: dup
10: iconst_1
11: bipush 7
13: iastore
14: dup
15: iconst_2
16: bipush 8
18: iastore
19: dup
20: iconst_3
21: bipush 6
23: iastore
24: dup
25: iconst_4
26: bipush 8
28: iastore
29: dup
30: iconst_5
31: iconst_0
32: iastore
33: dup
34: bipush 6
36: iconst_4
37: iastore
38: astore_1
39: aload_1
40: arraylength
41: istore_2
42: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
45: iload_2
46: invokedynamic #13, 0 // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
51: invokevirtual #17 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
54: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
57: aload_1
58: bipush 8
60: iaload
61: invokedynamic #23, 0 // InvokeDynamic #1:makeConcatWithConstants:(I)Ljava/lang/String;
66: invokevirtual #17 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
69: return
}
命令:javap -l ABC
输出:
Compiled from "ABC.java"
public class ABC {
public ABC();
LineNumberTable:
line 1: 0
public static void main(java.lang.String[]);
LineNumberTable:
line 6: 0
line 9: 39
line 12: 42
line 14: 54
line 16: 69
}
命令:javap -s ABC
输出:
Compiled from "ABC.java"
public class ABC {
public ABC();
descriptor: ()V
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
}
命令:javap -sysinfo ABC
输出:
Classfile /C:/Users/Nikhil Kumar/Documents/ABC.class
Last modified Sep 11, 2021; size 970 bytes
SHA-256 checksum 576adf03386399a4691e0ce5b6c5aa5d964b082a1a61299bac5632942e413312
Compiled from "ABC.java"
public class ABC {
public ABC();
public static void main(java.lang.String[]);
}
命令:javap -constants ABC
输出:
Compiled from "ABC.java"
public class ABC {
public ABC();
public static void main(java.lang.String[]);
}
命令:javap -version ABC
输出:
14
Compiled from "ABC.java"
public class ABC {
public ABC();
public static void main(java.lang.String[]);
}