javap(反汇编命令)详解【转】

简介:

转自:http://blog.csdn.net/hudashi/article/details/7062668

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查看编译版本












本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5881592.html ,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 程序员
揭秘汇编语言基础命令:掌握底层编程秘籍,你准备好挑战硬件的直接对话了吗?
【8月更文挑战第22天】大家好,今天分享汇编语言基础命令。汇编语言直接与硬件交互,高效而底层。对理解计算机原理至关重要。本文以x86架构为例,介绍环境搭建、数据定义、寄存器操作、算术运算及控制流指令。通过示例程序实现1至10的累加,展示基础命令的实际应用。虽然学习曲线陡峭,但掌握后能深刻理解计算机工作原理。一起来探索汇编语言的魅力吧!
45 3
|
3月前
|
NoSQL 程序员
"解锁计算机语言的神秘面纱:一探究竟,汇编语言基础命令如何操纵硬件世界!
【8月更文挑战第21天】汇编语言是最贴近硬件的编程语言,对理解计算机系统至关重要。它允许直接控制硬件执行底层操作。本文概览了汇编语言,介绍其基础命令,包括数据传输(如`MOV`, `PUSH`, `POP`)、算术逻辑(如`ADD`, `SUB`, `AND`, `OR`, `XOR`)及程序控制指令(如`JMP`, `JE`, `JNE`, `LOOP`)。这些命令为深入硬件世界奠定基础,帮助优化程序性能并激发底层编程兴趣。
61 0
|
5月前
|
Linux 编译器 C语言
深入理解Linux中的`as`命令:汇编器之旅
`as`命令是Linux下的GNU汇编器,用于将汇编语言源码(.s或.S)转化为机器码目标文件(.o)。它是GNU Binutils的一部分,在编译流程中扮演重要角色,尤其在底层编程和硬件交互时。基本用法是`as -o outputfile inputfile`。选项如`-g`添加调试信息,`-I`指定包含文件路径。通常与编译器如`gcc`配合使用,提供对计算机工作原理和操作系统底层的深入理解。学习汇编语言能增强编程和系统理解能力。
汇编语言基础命令
汇编语言基础命令
78 0
|
C语言 芯片
使用 gcc 命令把C语言程序反汇编
之前看过一点汇编,不过现在都忘记得差不多了。最近又很蛋疼地想起反汇编这个东西。这里使用 gcc 命令对 .c 文件进行反汇编,把 C语言 翻译成汇编语言 先准备一个简单的 C 程序 sum.c #include int add(int, int); int mode(int, i...
3908 0
汇编:用e命令为啥改不了内存的值?
题记:一次为学生的答疑,美妙的过程。 【学生】 老师 在不 【学生】 【学生】 咋总是这样呢?不明白哪里错了,为啥用e改不了 【学生】 好气哦 【迂者】 你的电脑得砸了,不能用 【学生】 。。。。。。很悲剧 【迂者】 是改了,但又变了 【迂者】 你想想,想不出来我再告你 【迂者】 你改的是一块特殊的区域 【学生】 咦 我想想 【学生】
1096 0
|
存储 Windows
反汇编教程及汇编命令详解(一)
原文地址:http://www.cnblogs.com/xqzhao/archive/2008/04/15/1154607.html原作者:济公计算机寄存器分类简介:32位CPU所含有的寄存器有: 4个数据寄存器(EAX、EBX、ECX和EDX) 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) 6个段寄存器(ES、CS、SS、DS、FS和GS) 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 1、数据寄存器 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。
1025 0
|
6月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
222 2