`

javap的使用

阅读更多

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

摘要:
  javap [ options ] class. . .

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

Java代码 复制代码

 

  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后,输出结果如下

Java代码 复制代码

 

   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,那么输出结果如下

Java代码 复制代码  
   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
 


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

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics