一、用法
javap [ 选项 ] classes
二、描述
javap命令反汇编一个或多个类文件。它的输出由使用的选项决定。如果没有使用选项,javap命令将打印输出传递给它的类的包, protected和public属性和方法。javap打印输出到标准输出。
选项
命令行选项。
classes
一个或多个(由空格隔开)的待处理的类列表。你可以指定一个可以在类路径上找到的类,通过文件名(例如,C:\myproject\src\DocFooter.class),或者使用一个URL (例如,file:///C:/myproject/src/DocFooter.class)。
例如,编译下面声明的类:
import java.awt.*;import java.applet.*;public class DocFooter extends Applet { String date; String email; public void init() { resize(500,100); date = getParameter("LAST_UPDATED"); email = getParameter("EMAIL"); } public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15); }}执行javap DocFooter(官网上是 javap DocFooter.class ,但在下面实践的时候会提示ERROR:cound not find DocFooter.class ,需要去掉.class后缀)得到的输出结果如下:
Compiled from "DocFooter.java"public class DocFooter extends java.applet.Applet { java.lang.String date; java.lang.String email; public DocFooter(); public void init(); public void paint(java.awt.Graphics);}执行javap -c DocFooter(同上,需要去掉.class后缀) 得到的输出结果如下:
Compiled from "DocFooter.java"public class DocFooter extends java.applet.Applet { java.lang.String date; java.lang.String email; public DocFooter(); Code: 0: aload_0 1: invokespecial #1 // Method java/applet/Applet."":()V 4: return public void init(); Code: 0: aload_0 1: sipush 500 4: bipush 100 6: invokevirtual #2 // Method resize:(II)V 9: aload_0 10: aload_0 11: ldc #3 // String LAST_UPDATED 13: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String; 16: putfield #5 // Field date:Ljava/lang/String; 19: aload_0 20: aload_0 21: ldc #6 // String EMAIL 23: invokevirtual #4 // Method getParameter:(Ljava/lang/String;)Ljava/lang/String; 26: putfield #7 // Field email:Ljava/lang/String; 29: return public void paint(java.awt.Graphics); Code: 0: aload_1 1: new #8 // class java/lang/StringBuilder 4: dup 5: invokespecial #9 // Method java/lang/StringBuilder." ":()V 8: aload_0 9: getfield #5 // Field date:Ljava/lang/String; 12: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 15: ldc #11 // String by 17: invokevirtual #10 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 20: invokevirtual #12 // Method java/lang/StringBuilder.toString:()Ljava/lang/String; 23: bipush 100 25: bipush 15 27: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V 30: aload_1 31: aload_0 32: getfield #7 // Field email:Ljava/lang/String; 35: sipush 290 38: bipush 15 40: invokevirtual #13 // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V 43: return }
三、选项
-help
--help
-?
打印输出javap的帮助信息。
-l
打印线和局部变量表。
-public
只显示public类及成员。
-protected
只显示protected和public类及成员。
-package
只显示包, protected和public类及成员。这是默认的。
-private
-p
显示所有类及成员。
-Jflag
直接将flag传递给运行期系统。例如:
javap -J-versionjavap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName
-s
打印内部的类型签名。
-sysinfo
显示正在被处理的类的系统信息 (路径, 大小, 日期, MD5 hash)。
-constants
显示static final常量.
-c
打印输出反汇编的代码,例如,对于类中的每一种方法,包含Java字节码的指令。这些在 文档中有描述。
-verbose
打印堆栈大小,方法中局部变量和参数个数。
-classpath path
指定javap命令用来查找类的路径。如果指定了它的值,将会覆盖默认的或是在CLASSPATH环境变量中的值。
-bootclasspath path
指定加载bootstrap类的路径。bootstrap类默认指的是在jre\lib\rt.jar和一些其他jar文件中实现了Java平台核心的类。
-extdirs dirs
覆盖寻找已安装的扩展的路径。默认的扩展安装路径是java.ext.dirs的值。
声明:文章内容翻译自Oracle官网,如有不正确指出,敬请指正,谢谢!