javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出 javap 的帮助信息
-version 版本信息
-v -verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
-l 输出行号和局部变量表
-public 仅显示公共类和成员
-protected 显示受保护的/公共类和成员
-package 显示程序包/受保护的/公共类和成员 (默认设置)
-p -private 显示所有类和成员
-c 对字节码进行反汇编,输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
-s 输出内部类型签名
-sysinfo 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)
-constants 显示最终常量
-classpath <path> 指定查找用户类文件的位置
-cp <path> 指定查找用户类文件的位置
-bootclasspath <path> 覆盖引导类文件的位置
如:已经有个Test.class文件,则javap -c test
uniwinmatoMacBook:desktop uniwin$ javac Test.java
uniwinmatoMacBook:desktop uniwin$ javap -c Test
Compiled from "Test.java"
public class Test {
public Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: new #2 // class SubCaller
3: dup
4: invokespecial #3 // Method SubCaller."<init>":()V
7: astore_1
8: aload_1
9: invokeinterface #4, 1 // InterfaceMethod Caller.call:()V
14: return
}