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
-version
用于打印 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
用于打印受保护/公共类和成员。
示例
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 应用程序时为他们提供竞争优势。
广告
数据结构
网络
RDBMS
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP