javap反编译java字节码文件

概述:

         javap是 Java class文件分解器,可以反编译,也可以查看Java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。

语法:

        把java文件编译为class文件:javac  Test.java  (Test.java为java文件名) 生成对应的 .class 文件 Test.class

        执行javap操作:javap 命令行 class文件名称(不加 .class后缀)

        例如: javap -c Test

命令行

 

  -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 平台的类,位于 jrelibt.jar 和 jrelibi18n.jar 中。
  -extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。

 

示例:

一个Demo.java文件(存放在桌面)

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. class Demo   
  2. {  
  3.     public static void main(String[] args)   
  4.     {  
  5.         Integer aInteger = 56;  
  6.         int aInt=0;  
  7.         int aInt2 = 123;  
  8.         String s="helloworld";  
  9.         String aString = new String("IamString");  
  10.     }  
  11. }  

执行命令行操作

 

反汇编结果

 

[java] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. Compiled from "Demo.java"  
  2. class Demo {  
  3.   Demo();  
  4.     Code:  
  5.        0: aload_0  
  6.        1: invokespecial #1                  // Method java/lang/Object."<init>":()V  
  7.        4: return  
  8.   
  9.   public static void main(java.lang.String[]);  
  10.     Code:  
  11.        0: bipush        56  
  12.        2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;  
  13.        5: astore_1  
  14.        6: iconst_0  
  15.        7: istore_2  
  16.        8: bipush        123  
  17.       10: istore_3  
  18.       11: ldc           #3                  // String helloworld  
  19.       13: astore        4  
  20.       15: new           #4                  // class java/lang/String  
  21.       18: dup  
  22.       19: ldc           #5                  // String IamString  
  23.       21: invokespecial #6                  // Method java/lang/String."<init>":(Ljava/lang/String;)V  
  24.       24: astore        5  
  25.       26: return  
  26. }  

 

 

对其中的语法不清楚啊?可以参照一下这两篇博客:

javap -c 命令详解 http://blog.csdn.net/junsure2012/article/details/7099222

JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc) http://www.cnblogs.com/luyanliang/p/5498584.html

如果还不清楚,放大招了:

Oracle 官方文档  Chapter 4. The class File Format  http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

posted @ 2016-12-03 16:18  天涯海角路  阅读(201)  评论(0)    收藏  举报