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的参数. 例如:
    1. javap -J-version
    2. javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName
    更多 JVM option 的信息, 请参考 [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代码:

  1. import java.awt.*;
  2. import java.applet.*;
  3. public class DocFooter extends Applet {
  4. String date;
  5. String email;
  6. public void init() {
  7. resize(500,100);
  8. date = getParameter("LAST_UPDATED");
  9. email = getParameter("EMAIL");
  10. }
  11. public void paint(Graphics g) {
  12. g.drawString(date + " by ",100, 15);
  13. g.drawString(email,290,15);
  14. }
  15. }

编译之后, 执行 javap DocFooter.class 命令, 结果如下:

  1. Compiled from "DocFooter.java"
  2. public class DocFooter extends java.applet.Applet {
  3. java.lang.String date;
  4. java.lang.String email;
  5. public DocFooter();
  6. public void init();
  7. public void paint(java.awt.Graphics);
  8. }

如果加上 -c 选项, 执行 javap -c DocFooter.class 后结果如下:

  1. Compiled from "DocFooter.java"
  2. public class DocFooter extends java.applet.Applet {
  3. java.lang.String date;
  4. java.lang.String email;
  5. public DocFooter();
  6. Code:
  7. 0: aload_0
  8. 1: invokespecial #1 // Method
  9. java/applet/Applet."<init>":()V
  10. 4: return
  11. public void init();
  12. Code:
  13. 0: aload_0
  14. 1: sipush 500
  15. 4: bipush 100
  16. 6: invokevirtual #2 // Method resize:(II)V
  17. 9: aload_0
  18. 10: aload_0
  19. 11: ldc #3 // String LAST_UPDATED
  20. 13: invokevirtual #4 // Method
  21. getParameter:(Ljava/lang/String;)Ljava/lang/String;
  22. 16: putfield #5 // Field date:Ljava/lang/String;
  23. 19: aload_0
  24. 20: aload_0
  25. 21: ldc #6 // String EMAIL
  26. 23: invokevirtual #4 // Method
  27. getParameter:(Ljava/lang/String;)Ljava/lang/String;
  28. 26: putfield #7 // Field email:Ljava/lang/String;
  29. 29: return
  30. public void paint(java.awt.Graphics);
  31. Code:
  32. 0: aload_1
  33. 1: new #8 // class java/lang/StringBuilder
  34. 4: dup
  35. 5: invokespecial #9 // Method
  36. java/lang/StringBuilder."<init>":()V
  37. 8: aload_0
  38. 9: getfield #5 // Field date:Ljava/lang/String;
  39. 12: invokevirtual #10 // Method
  40. java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  41. 15: ldc #11 // String by
  42. 17: invokevirtual #10 // Method
  43. java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
  44. 20: invokevirtual #12 // Method
  45. java/lang/StringBuilder.toString:()Ljava/lang/String;
  46. 23: bipush 100
  47. 25: bipush 15
  48. 27: invokevirtual #13 // Method
  49. java/awt/Graphics.drawString:(Ljava/lang/String;II)V
  50. 30: aload_1
  51. 31: aload_0
  52. 32: getfield #7 // Field email:Ljava/lang/String;
  53. 35: sipush 290
  54. 38: bipush 15
  55. 40: invokevirtual #13 // Method
  56. java/awt/Graphics.drawString:(Ljava/lang/String;II)V
  57. 43: return
  58. }

更多信息请参考