javap是JDK自带的反汇编器可以查看java编译器为我们生成的字节码通过它我们可以对照源代码和字节码从而了解很多编译器内部的工作
语法
javap [ 命令选项 ] class
javap 命令用于解析类文件其输出取决于所用的选项若没有使用选项javap 将输出传递给它的类的 public 域及方法javap 将其输出到标准输出设备上
命令选项
help 输出 javap 的帮助信息
l 输出行及局部变量表
b 确保与 JDK 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
tjar 和 jrelibinjar 中
extdirs[dirs] 覆盖搜索安装方式扩展的位置扩展的缺省位置是 jrelibext
实例
Hellojava文件
public class Hello
{
static void main(String args[])
{
int i=;
int j=;
int m=i+j;
Systemoutprintln(m:+m);
}
int get()
{
int a=;
int b=;
int c=;
int d=;
int e=;
int f=;
int n=a+b+c+d+e+f;
return n;
}
static int get()
{
int a=;
int b=;
int c=;
int d=a+b;
return d;
}
}
然后再执行以下命令
javac Hellojava
javap c Hello
得到
Compiled from Hellojava
public class Hello extends javalangObject{
public Hello();
Code:
:
aload_
:
invokespecial #; //Method java/lang/Object<init>:()V
:
return
static void main(javalangString[]);
Code:
:
bipush
:
istore_
:
bipush
:
istore_
:
iload_
:
iload_
:
iadd
:
istore_
:
getstatic #; //Field java/lang/Systemout:Ljava/io/PrintStream;
:
new #; //class java/lang/StringBuilder
:
dup
:
invokespecial #; //Method java/lang/StringBuilder<init>:()V
:
ldc #; //String m:
:
invokevirtual #; //Method java/lang/StringBuilderappend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
:
iload_
:
invokevirtual #; //Method java/lang/StringBuilderappend:(I)Ljava/lang/StringBuilder;
:
invokevirtual #; //Method java/lang/StringBuildertoString:()Ljava/lang/String;
:
invokevirtual #; //Method java/io/PrintStreamprintln:(Ljava/lang/String;)V
:
return
int get();
Code:
:
iconst_
:
istore_
:
iconst_
:
istore_
:
iconst_
:
istore_
:
iconst_
:
istore
:
iconst_
:
istore
:
bipush
:
istore
:
iload_
:
iload_
:
iadd
:
iload_
:
iadd
:
iload
:
iadd
:
iload
:
iadd
:
iload
:
iadd
:
istore
:
iload
:
ireturn
static int get();
Code:
:
iconst_
:
istore_
:
bipush
:
istore_
:
bipush
:
istore_
:
iload_
:
iload_
:
iadd
:
istore_
:
iload_
:
ireturn
}