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-versionjavap -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
}