Javap命令

207 阅读3分钟

Javap Command

拆卸一个或多个类文件。

概要
javap [options] classfile...
options

命令选项。见Options

classfile

一个或空格分隔的多个类。指定一个在class路径能找到的类,通过文件名或者像file:///home/user/myproject/src/DocFooter.class的URL。

描述

javap命令拆卸一个或者多个类文件。输出取决于使用的功能选项。当没有指定选项时,javap命令打印包,受保护和公共的属性,方法。打印它的输出到标准输出。

选项
  • -help

  • -?

    打印帮助信息

  • -version

    打印版心信息

  • -l

    打印行和本地变量表

  • -public

    只展示公共类和成员

  • -protected

    只展示受保护的和公共的类和成员

  • -private

  • -p

    展示所有的类和成员

  • -Joption

    传递指定的选项给JVM。例如

    javap -J-version

    javap -J-Djava.security.manager -J-Djava.security.policy=MyPolicy MyClassName

  • -s

    打印内部类型签名

  • -sysinfo

    展示需要处理的类的系统信息(路径,大小,日期,MD5哈希)

  • -constants

    展示static final常量

  • -C

    打印拆卸的代码。例如:包含java字节码的指令,用于类中的每个方法

  • -verbose

    打印堆栈大小、本地数和方法的参数

  • -classpath path

    指定javap命令用来查找类的路径。使用会重写默认的和classpath环境变量

  • -bootclasspath path

    指定加载启动类的路径。默认的,启动类是实现了位于jre/lib/rt.jar的核心Java平台的类和一些其他的JAR文件。

  • -extdir dirs

    重写搜寻已安装的扩展的位置。默认的扩展的位置是java.ext.dirs

例子
编译以下的DocFooter
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);
}

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."<init>":()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."<init>":()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        
}