javap
Disassembles one or more class files.
展开(Disassembles)一到多个 class 文件
javap概述(Synopsis)
javap options classfile …
- options
The command-line options. See Options.
命令行参数, 请参考下方的选项(Options)部分。
- classfile
One or more classes separated by spaces to be processed for annotations such as DocFooter.class. You can specify a class that can be found in the class path, by its file name or with a URL such as file:///home/user/myproject/src/DocFooter.class.
参数为一到多个 class 文件, 使用空格分隔, 例如 DocFooter.class。可以是 class path 中的某个类, 例如文件名或者是文件URL, 如 file:///home/user/myproject/src/DocFooter.class。
说明(Description)
The javap command disassembles one or more class files. The output depends on the options used. When no options are used, then the javap command prints the package, protected and public fields, and methods of the classes passed to it. The javap command prints its output to stdout.
javap 命令展开一个/或多个 class 文件。可以通过命令选项控制输出的具体内容。如果不指定任何选项, 则打印出 package, protected 和 public 字段(fields), 以及参数中指定 class 的方法。 javap命令的结果内容输出到 stdout。
选项(Options)
-help,--help,-?打印出javap命令的帮助信息.-version打印出javap命令的版本(release)信息.-l打印出行号(line)以及局部变量表(local variable tables).-public只显示 public 类和成员.-protected只显示 protected/public 类和成员.-private,-p显示所有的类和成员(all classes and members).-J_xxxoption_传递给底层JVM的参数. 例如:
更多 JVM option 的信息, 请参考javap -J-versionjavap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName
[java]($05_Create_and_Build-05_04_java.md) 命令的官方文档.-s打印内部类型签名(internal type signatures).-sysinfo显示class文件的系统信息(如文件路径(path), 大小(size), 修改日期(date), 以及MD5 hash).-constants显示static final常量信息.-c打印反编译后的代码(disassembled code), 例如, 以指令(instructions)的方式展示 class 中每个方法的字节码.-verbose打印 stack size, 局部变量number of locals and arguments for methods.-classpath _path_指定javap命令查找 class 时所使用的 classpath 路径. 如果指定该参数, 则会覆盖默认的系统环境变量CLASSPATH值.-bootclasspath _path_指定加载 bootstrap 类的路径. 默认情况下, bootstrap classes 从Java安装目录下的jre/lib/rt.jar以及其他几个 JAR 包中加载.-extdir _dirs_手工指定安装 extensions 的查找目录. 默认 extensions 目录由java.ext.dirs的值指定.
示例
下面是 DocFooter 类的Java代码:
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.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);}
如果加上 -c 选项, 执行 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_01: invokespecial #1 // Methodjava/applet/Applet."<init>":()V4: returnpublic void init();Code:0: aload_01: sipush 5004: bipush 1006: invokevirtual #2 // Method resize:(II)V9: aload_010: aload_011: ldc #3 // String LAST_UPDATED13: invokevirtual #4 // MethodgetParameter:(Ljava/lang/String;)Ljava/lang/String;16: putfield #5 // Field date:Ljava/lang/String;19: aload_020: aload_021: ldc #6 // String EMAIL23: invokevirtual #4 // MethodgetParameter:(Ljava/lang/String;)Ljava/lang/String;26: putfield #7 // Field email:Ljava/lang/String;29: returnpublic void paint(java.awt.Graphics);Code:0: aload_11: new #8 // class java/lang/StringBuilder4: dup5: invokespecial #9 // Methodjava/lang/StringBuilder."<init>":()V8: aload_09: getfield #5 // Field date:Ljava/lang/String;12: invokevirtual #10 // Methodjava/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;15: ldc #11 // String by17: invokevirtual #10 // Methodjava/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;20: invokevirtual #12 // Methodjava/lang/StringBuilder.toString:()Ljava/lang/String;23: bipush 10025: bipush 1527: invokevirtual #13 // Methodjava/awt/Graphics.drawString:(Ljava/lang/String;II)V30: aload_131: aload_032: getfield #7 // Field email:Ljava/lang/String;35: sipush 29038: bipush 1540: invokevirtual #13 // Methodjava/awt/Graphics.drawString:(Ljava/lang/String;II)V43: return}
