首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

javap的施用

2012-10-07 
javap的使用avap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工

javap的使用
avap是jdk自带的一个工具,可以反编译,也可以查看java编译器生成的字节码,是分析代码的一个好工具。
[size=large; padding: 0px; margin: 0px;][size=medium; padding: 0px; margin: 0px;]javap - Java class文件分解器[/size][/size]
  分解class文件

摘要:
  javap [ options ] class. . .

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

import java.awt.*;    import java.applet.*;      public class DocFooter extends Applet {         String date;         String email;           public void init() {                 resize(500,100);                 date = getParameter("LAST_UPDATED");                 email = getParameter("EMAIL");         }           public void paint(Graphics g) {                 g.drawString(date + " by ",100, 15);                 g.drawString(email,290,15);         }    }  

import java.awt.*;   import java.applet.*;   public class DocFooter extends Applet {        String date;        String email;        public void init() {                resize(500,100);                date = getParameter("LAST_UPDATED");                email = getParameter("EMAIL");        }        public void paint(Graphics g) {                g.drawString(date + " by ",100, 15);                g.drawString(email,290,15);        }   }


在命令行上键入javap DocFooter后,输出结果如下
Compiled from DocFooter.java   public class DocFooter extends java.applet.Applet {    java.lang.String date;    java.lang.String email;    public DocFooter();    public void init();    public void paint(java.awt.Graphics);   }   

Compiled from DocFooter.java  public class DocFooter extends java.applet.Applet {    java.lang.String date;    java.lang.String email;    public DocFooter();    public void init();    public void paint(java.awt.Graphics);   }


如果加入了-c,即javap -c DocFooter,那么输出结果如下
Compiled from DocFooter.java   public class DocFooter extends java.applet.Applet {       java.lang.String date;       java.lang.String email;       public DocFooter();       public void init();       public void paint(java.awt.Graphics);   }     Method DocFooter()      0 aload_0      1 invokespecial #1       4 return    Method void init()      0 aload_0      1 sipush 500     4 bipush 100     6 invokevirtual #2       9 aload_0     10 aload_0     11 ldc #3      13 invokevirtual #4      16 putfield #5      19 aload_0     20 aload_0     21 ldc #6      23 invokevirtual #4      26 putfield #7      29 return    Method void paint(java.awt.Graphics)      0 aload_1      1 new #8       4 dup      5 invokespecial #9       8 aload_0      9 getfield #5      12 invokevirtual #10      15 ldc #11      17 invokevirtual #10      20 invokevirtual #12      23 bipush 100    25 bipush 15    27 invokevirtual #13      30 aload_1     31 aload_0     32 getfield #7      35 sipush 290    38 bipush 15    40 invokevirtual #13      43 return 

Compiled from DocFooter.javapublic class DocFooter extends java.applet.Applet {    java.lang.String date;    java.lang.String email;    public DocFooter();    public void init();    public void paint(java.awt.Graphics);}

Method DocFooter()   0 aload_0   1 invokespecial #1    4 returnMethod void init()   0 aload_0   1 sipush 500   4 bipush 100   6 invokevirtual #2    9 aload_0  10 aload_0  11 ldc #3   13 invokevirtual #4   16 putfield #5   19 aload_0  20 aload_0  21 ldc #6   23 invokevirtual #4   26 putfield #7   29 returnMethod void paint(java.awt.Graphics)   0 aload_1   1 new #8    4 dup   5 invokespecial #9    8 aload_0   9 getfield #5   12 invokevirtual #10   15 ldc #11   17 invokevirtual #10   20 invokevirtual #12   23 bipush 100  25 bipush 15  27 invokevirtual #13   30 aload_1  31 aload_0  32 getfield #7   35 sipush 290  38 bipush 15  40 invokevirtual #13   43 return

当然,如果想分析这个文件,可以讲输出结果输出到一个文件里。可以这样写
javap -c DocFooter > F://test.txt
这样就会输出到F盘的test.txt文件中了。
选项:
   -help 不说了
   -l 输出行和变量的表
   -public 只输出public方法和域
   -protected 只输出public和protected类和成员
   -package 只输出包,public和protected类和成员,这是默认的
   -private  输出所有类和成员
   -s 输出内部类型签名
   -c 输出分解后的代码,例如,类中每一个方法内,包含java字节码的指令,
   -verbose 输出栈大小,方法参数的个数
   。。。

热点排行