javap 是 JDK 自带的字节码反编译工具,用于查看 .class 文件结构(如常量池、方法字节码、签名等),不还原源码;常用选项:-c 显示字节码指令,-v 输出最详细信息,-s 显示泛型签名,-l 显示行号与局部变量表(需 -g 编译)。

javap 是 JDK 自带的字节码反编译工具,用于查看已编译类文件(.class)的结构信息,比如常量池、字段、方法签名、字节码指令等。它不还原 Java 源代码,但能清晰展示编译后的底层结构,是调试、理解 JVM 行为和排查类加载问题的重要工具。
常用命令选项说明
-c:显示每个方法的字节码指令(即 JVM 指令列表),这是最常用的选项之一。它能帮你看到编译器如何将 Java 代码翻译成栈操作指令。
-v 或 -verbose:输出最详细的信息,包括版本号、常量池、访问标志、字段/方法的完整描述、异常表、属性(如 LineNumberTable、LocalVariableTable)等。适合深度分析类结构。
-s:显示内部类型签名(signature),对泛型、数组、嵌套类等类型的准确表达很有用。例如 List<String> 会显示为 Ljava/util/List<Ljava/lang/String;>;。
立即学习“Java免费学习笔记(深入)”;
-l:显示行号表(LineNumberTable)和局部变量表(LocalVariableTable),有助于将字节码指令与源码行号或变量名对应,前提是编译时加了 -g 参数(默认 javac 不生成局部变量名信息)。
实用组合示例
-
javap String:查看 String 类的公共结构(仅 public 成员) -
javap -c ArrayList:查看 ArrayList 中各方法的字节码实现 -
javap -v MyClass:完整解析 MyClass.class,含常量池、属性、签名等全部细节 -
javap -s -p MyGenericClass:显示私有成员(-p)和泛型签名(-s),适合分析泛型擦除后的真实类型信息
注意事项
javap 默认只显示 public 成员;如需查看 private、protected 或 package-private 成员,需加上 -p(即 --private)选项。
若提示 “class not found”,检查类路径是否正确,可使用 -cp 指定 classpath,例如:javap -cp ./classes com.example.MyClass。
要让 -l 显示有意义的局部变量名,编译时建议加 javac -g MyClass.java,否则 LocalVariableTable 可能为空或只有索引无名称。
快速验证小技巧
写一个简单类(如含 for 循环或 try-catch 的方法),用 javac 编译后,用 javap -c 查看对应方法,能直观看到循环如何转为 goto 指令、异常处理块如何用 exception table 标记——这是理解 JVM 控制流机制的直接入口。










