javap(反汇编命令)详解

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
语法:
   javap [ 命令选项 ] class. . .
  javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。
命令选项
   -help 输出 javap 的帮助信息。
   -l 输出行及局部变量表。
   -b 确保与 JDK 1.1 javap 的向后兼容性。
   -public 只显示 public 类及成员。
   -protected 只显示 protected 和 public 类及成员。
   -package 只显示包、protected 和 public 类及成员。这是缺省设置。
   -private 显示所有类和成员。
   -J[flag] 直接将 flag 传给运行时系统。
   -s 输出内部类型签名。
   -c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
   -verbose 输出堆栈大小、各方法的 locals 及 args 数, 以及class文件的编译版本
   -classpath [路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
   - bootclasspath [路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelib
  t.jar 和 jrelibi18n.jar 中。
   -extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
实例1:
Hello.java文件
public class Hello
{
static void main(String args[])
{
int i=10;
int j=100;
int m=i+j;
System.out.println("m:"+m);
}
int get()
{
int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int f=6;
int n=a+b+c+d+e+f;
return n;
}
static int get2()
{
int a=1;
int b=12;
int c=39;
int d=a+b;
return d;
}
}
然后再执行以下命令:
javac Hello.java
javap -c Hello
得到
Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

static void main(java.lang.String[]);
Code:
0: bipush 10
2: istore_1
3: bipush 100
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: istore_3
10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
13: new #3; //class java/lang/StringBuilder
16: dup
17: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
20: ldc #5; //String m:
22: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: iload_3
26: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
29: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
32: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
35: return

int get();
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iconst_3
5: istore_3
6: iconst_4
7: istore 4
9: iconst_5
10: istore 5
12: bipush 6
14: istore 6
16: iload_1
17: iload_2
18: iadd
19: iload_3
20: iadd
21: iload 4
23: iadd
24: iload 5
26: iadd
27: iload 6
29: iadd
30: istore 7
32: iload 7
34: ireturn

static int get2();
Code:
0: iconst_1
1: istore_0
2: bipush 12
4: istore_1
5: bipush 39
7: istore_2
8: iload_0
9: iload_1
10: iadd
11: istore_3
12: iload_3
13: ireturn

}
另外关于如何使用 javap命令查看 class文件的编译版本请参考《 用javap查看编译版本
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值