`
solomongg
  • 浏览: 51493 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

javap的使用

JVM 
阅读更多

javap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。
javap - Java class文件分解器
  分解class文件

摘要:
  javap [ options ] 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 " , 100 15 );  
  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 输出栈大小,方法参数的个数
   。。。

http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javap.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics