Java Javap工具示例
javap工具是检索特定类或接口信息的有用方法。通过其反汇编功能,javap命令(也称为Java反汇编器)可以提供用户全面的内部信息。通过使用两个选项-c或-verbose,每个选项都会提供独特的结果,用户可以进入字节码和字节码编排的领域。如果不使用任何选项,javap将运行输入类的公共、受保护和包字段和方法。
语法
javap [option] [classname]
当不使用任何选项时
示例
javap class_name
输出
C:\Users\Aashi>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 {};
}
当使用选项时
以下是每个选项的解释及如何应用它:
- -help或–help或-? −
这用于打印javap命令的帮助信息。
示例
javap -help
输出
C:\Users\Aashi>javap -help
Usage: javap <options> <classes>
where possible options include:
-help --help -? Print this usage message
-version Version information
-V -verbose Print additional information
-1 Print line number and local variable tables
-public Show only public classes and members
-protected Show protected/public classes and members
-package Show package/protected/public classes and members (default)
-p -private Show all classes and members
-C Disassemble the code
-S Print internal type signatures
-sysinfo Show system info (path, size, date, MD5 hash) of class being processed
-constants Show final constants
-classpath <path> Specify where to find user class files
-cp <path> Specify where to find user class files
-bootclasspath <path> Override location of bootstrap class files
- 版本
这用于打印Java的版本信息。
示例
javap -version
输出
C:\Users\Aashi>javap -version
1.8.0_151
- -v或-verbose −
该选项用于打印额外的信息,如方法的堆栈大小、本地变量和参数数量。
示例
javap -v class_name
输出
C:\Users\Aashi>javap -v java.lang.Object
Classfile jar:file:/C:/Program%20Files/Java/jdk1.8.0_151/jre/lib/rt.jar! /java/lang/Object.class
Last modified Sep 5, 2017; size 1497 bytes
MD5 checksum 074ebc688a81170b8740f1158648a3c7
Compiled from "Object.java"
public class java.lang.Object
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Integer 999999
#2 - String #16 //@
#3 = String #38 //nanosecond timeout value out of range
#4 = String #42 //timeout value is negative
#5 - Utf8 ()I
#6 = Utf8 ()Ljava/lang/Object;
#7 - Utf8 ()Ljava/lang/String;
#8 = Utf8 ()V
#9 - Utf8 (I)Ljava/lang/String;
#10 - Utf8 (J)V
#11 = Utf8 (JI)V
#12 - Utf8 (Ljava/lang/Object;)Z
#13 = Utf8 (Ljava/lang/String;)V
#14 - Utf8 <clinit>
#15 = Utf8 <init>
#16 - Utf8 @
#17 - Utf8 Code
#18 = Utf8 Exceptions
#19 - Utf8 Line Number Table
#20 = Utf8 Signature
#21- Utf8 Source File
#22 = Utf8 StackMapTable
#23 Utf8 Append
#24 Utf8 Clone
#25 = Utf8 Equals
#26 Utf8 finalize
#27 = Utf8 getClass
#28 Utf8 getName
#29 - Utf8 hashCode
#30 = Utf8 java/lang/Class
#31 - Utf8 java/lang/CloneNotSupportedException
#32 = Utf8 java/lang/IllegalArgumentException
#33 - Utf8 Java/lang/Integer
#34 Utf8 java/lang/InterruptedException
- -l −
此选项用于打印行号和本地变量表。
示例
javap -l class_name
输出
C:\Users\Aashi>javap -1 java.lang.Object
Compiled from "Object.java”
public class java.lang.Object {
public java.lang.Object();
LineNumberTable:
line 37: 0
public final native java.lang.Class<?> getClass();
public native int hashCode();
public boolean equals(java.lang.Object);
LineNumberTable:
line 149: 0
protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;
public java.lang.String toString();
LineNumberTable:
line 236: 0
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;
LineNumberTable:
line 447: 0
line 448: 6
line 451: 16
line 452: 26
line 456: 36
line 457: 40
line 460: 44
line 461: 49
public final void wait() throws java.lang.InterruptedException;
LineNumberTable:
line 502:0
line 503: 5
protected void finalize() throws java.lang.Throwable;
}
- -public
这用于仅打印公共类和成员。
示例
javap -public class_name
输出
C:\Users\Aashi>javap -public 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);
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
这是用于打印protected/public类和成员的。
示例
javap -protected class_name
输出
C:\Users\Aashi>javap -protected 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;
}
- -package
这用于打印包/受保护/公共类和成员(默认)。
示例
javap -package class_name
输出
C:\Users\Aashi>javap -package 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 {};
}
- -c
这用于打印反汇编代码。
示例
javap -c class_name
输出
C:\Users\Aashi>javap -c java.lang.Object
Compiled from "Object.java"
public class java.lang.Object (public java.lang.Object();
Code:
0: return
public final native java.lang.Class<?> getClass();
public native int hashCode();
public boolean equals(java.lang.Object);
Code:
0: aload e
1: aload_1
2: 1f_acmpne 9
5:iconst_1
6: goto 10
9: iconst_0
10: ireturn
protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;
public java.lang.String toString();
Code:
0: new #52 //class java/lang/StringBuilder
3: dup
4: invokespecial #74 //Method java/lang/StringBuilder."<init>": ()V
7: aload_e
8: invokevirtual #73 // Method getClass: ()Ljava/lang/Class;
11: invokevirtual #67 // Method java/lang/class.getName:()Ljava/lang/String;
14: invokevirtual #76 // Method java/lang/StringBuilder.append: (Ljava/lang/String;) Ljava/lang/StringBuilder;
17: 1dc #2 // String @
19: invokevirtual #76 // Method java/lang/StringBuilder.append: (Ljava/lang/String;)Ljava/lang/StringBuilder;
22: aload_e
23: invokevirtual #78 // Method hashCode: ()I
26: invokestatic #69 // Method java/lang/Integer.toHexString: (I) Ljava/lang/String;
29: invokevirtual #76 // Method java/lang/StringBuilder.append: (Ljava/lang/String;) Ljava/lang/StringBuilder;
32: invokevirtual #75 // Method java/lang/StringBuilder.toString: ()Ljava/lang/String;
35: areturn
public final native void notify();
- -s −
用于打印内部类型签名。
示例
javap -s class_name
输出
C:\Users\Aashi>javap -s java.lang.Object
Compiled from "Object.java"
public class java.lang.Object {
public java.lang.Object();
descriptor: ()V
public final native java.lang.Class<?> getClass();
descriptor: ()Ljava/lang/class;
public native int hashCode();
descriptor: ()I
public boolean equals(java.lang.Object);
descriptor: (Ljava/lang/Object;)Z
protected native java.lang.Object clone() throws java.lang.CloneNotSupportedException;
descriptor:()Ljava/lang/Object;
public java.lang.String toString();
descriptor: ()Ljava/lang/String;
public final native void notify();
descriptor: ()V
public final native void notifyAll();
descriptor: ()V
public final native void wait(long) throws java.lang.InterruptedException; descriptor: (J)V
public final void wait(long, int) throws java.lang.InterruptedException; descriptor: (JI)V
public final void wait() throws java.lang.InterruptedException;
descriptor: ()V
protected void finalize() throws java.lang.Throwable;
descriptor: ()V
static {};
descriptor: ()V
}
- -sysinfo −
这用于打印正在处理的类的系统信息(路径、大小、日期、MD5哈希)。
示例
javap -sysinfo class_name
输出
C:\Users\Aashi>javap -sysinfo java.lang.Object
Classfile jar:file:/C:/Program%20Files/Java/jdk1.8.0_151/jre/lib/rt.jar! /java/lang/Object.class
Last modified Sep 5, 2017; size 1497 bytes
MD5 checksum 074ebc688a81170b8740f1158648a3c7
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 {};
}
- -constants −
这用于打印类的最终常量。
示例
javap -constants class_name
输出
C:\Users\Aashi>javap -constants 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程序员,可以帮助他们诊断和调试类文件,评估字段和方法,并从类文件的字节码生成可读的代码。这个不可或缺的工具适用于各个技能水平的Java开发人员,使他们能够扩展知识并轻松解决Java程序的问题。对于任何有抱负的编码人员来说,javap工具是不可替代的,肯定能迅速提升他们的编程能力。此外,它广泛的功能还可帮助编码人员改进实践方法,在构建Java应用程序时提供竞争优势。