Javap使用说明

来源:互联网 发布:微信淘宝秒杀是真的吗 编辑:程序博客网 时间:2024/04/28 22:50

学习JVM知识看到JAVAP可以反编译出Class的二进制文件,很是好奇,收集网上资料以备学习。


描述: 
  javap命令分解一个class文件,它根据options来决定到底输出什么。如果没有使用options,那么javap将会输出包,类里的protected和public域以及类里的所有方法。javap将会把它们输出在标准输出上。来看这个例子,先编译下面这个类。 

Java代码  收藏代码
  1. import java.awt.*;  
  2.  import java.applet.*;  
  3.   
  4.  public class DocFooter extends Applet {  
  5.       String date;  
  6.       String email;  
  7.   
  8.       public void init() {  
  9.               resize(500,100);  
  10.               date = getParameter("LAST_UPDATED");  
  11.               email = getParameter("EMAIL");  
  12.       }  
  13.   
  14.       public void paint(Graphics g) {  
  15.               g.drawString(date + " by ",10015);  
  16.               g.drawString(email,290,15);  
  17.       }  
  18.  }  

在命令行上键入javap DocFooter后,输出结果如下 
Java代码  收藏代码
  1. Compiled from DocFooter.java  
  2. public class DocFooter extends java.applet.Applet {  
  3.  java.lang.String date;  
  4.  java.lang.String email;  
  5.  public DocFooter();  
  6.  public void init();  
  7.  public void paint(java.awt.Graphics);  
  8. }  

如果加入了-c,即javap -c DocFooter,那么输出结果如下 
Java代码  收藏代码
  1.    Compiled from DocFooter.java  
  2. public class DocFooter extends java.applet.Applet {  
  3.     java.lang.String date;  
  4.     java.lang.String email;  
  5.     public DocFooter();  
  6.     public void init();  
  7.     public void paint(java.awt.Graphics);  
  8. }  
  9.   
  10. Method DocFooter()  
  11.    0 aload_0  
  12.    1 invokespecial #1   
  13.    4 return  
  14.   
  15. Method void init()  
  16.    0 aload_0  
  17.    1 sipush 500  
  18.    4 bipush 100  
  19.    6 invokevirtual #2   
  20.    9 aload_0  
  21.   10 aload_0  
  22.   11 ldc #3   
  23.   13 invokevirtual #4   
  24.   16 putfield #5   
  25.   19 aload_0  
  26.   20 aload_0  
  27.   21 ldc #6   
  28.   23 invokevirtual #4   
  29.   26 putfield #7   
  30.   29 return  
  31.   
  32. Method void paint(java.awt.Graphics)  
  33.    0 aload_1  
  34.    1 new #8   
  35.    4 dup  
  36.    5 invokespecial #9   
  37.    8 aload_0  
  38.    9 getfield #5   
  39.   12 invokevirtual #10   
  40.   15 ldc #11   
  41.   17 invokevirtual #10   
  42.   20 invokevirtual #12   
  43.   23 bipush 100  
  44.   25 bipush 15  
  45.   27 invokevirtual #13   
  46.   30 aload_1  
  47.   31 aload_0  
  48.   32 getfield #7   
  49.   35 sipush 290  
  50.   38 bipush 15  
  51.   40 invokevirtual #13   
  52.   43 return  
  53.    

当然,如果想分析这个文件,可以讲输出结果输出到一个文件里。可以这样写 
javap -c DocFooter > F://test.txt 
这样就会输出到F盘的test.txt文件中了。 

选项: 
   -help 不说了 
   -l 输出行和变量的表 
   -public 只输出public方法和域 
   -protected 只输出public和protected类和成员 
   -package 只输出包,public和protected类和成员,这是默认的 
   -private  输出所有类和成员 
   -s 输出内部类型签名 
   -c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令, 
   -verbose 输出栈大小,方法参数的个数 



原创粉丝点击