`
andesen
  • 浏览: 6653 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

javap -java class

    博客分类:
  • Java
 
阅读更多

 

From:http://hi.baidu.com/tianhuimin/blog/item/3fcb61d019e57b9fa1ec9c80.html

 

‍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 Uenucom 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. }
import java.awt.*;
   import java.applet.*;

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

Java代码
1.Compiled from Uenucom.java  
2.public class Uenucom extends java.applet.Applet {  
3. java.lang.String date;  
4. java.lang.String email;  
5. public Uenucom();  
6. public void init();  
7. public void paint(java.awt.Graphics);  
8.}  
   Compiled from Uenucom.java
   public class Uenucom extends java.applet.Applet {
    java.lang.String date;
    java.lang.String email;
    public Uenucom();
    public void init();
    public void paint(java.awt.Graphics);
   }

如果加入了-c,即javap -c Uenucom,那么输出结果如下

Java代码
1.   Compiled from Uenucom.java  
2.public class Uenucom extends java.applet.Applet {  
3.    java.lang.String date;  
4.    java.lang.String email;  
5.    public Uenucom();  
6.    public void init();  
7.    public void paint(java.awt.Graphics);  
8.}  
9.
10.Method Uenucom()  
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.  
   Compiled from Uenucom.java
public class Uenucom extends java.applet.Applet {
    java.lang.String date;
    java.lang.String email;
    public Uenucom();
    public void init();
    public void paint(java.awt.Graphics);
}

Method Uenucom()
   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 Uenucom > F://test.txt
这样就会输出到F盘的test.txt文件中了。

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

 

======================================================================

 

‍摘要: javap是一个很好的深入查看程序内部运行机制的工具,不过它有不同于汇编的自有格式的语句。本文
通过用javap对 i=i++ + ++i 这一特殊语言现象进行分析,带你进入javap的微观世界。============================================ ================================================
        首先我们来了解一下javap命令及其基本用法。
javap是sun提供的对class文件进行反编译的工具,javap和javac、java等bin文件存放路径相同,当你配置好了环
境变量后,javap就和javac、java等命令的用法类似了。
        javap最基本的用法,也是最常用的用法如下:
        javap -[参数] test
        其中,test是test.java文件经javac编译后产生的class文件名,也就是说,在javap之前,你必须用javac编译这
个文件,需要注意的一点是,在使用javap反编译.class文件时,不要带上其后缀名,否则会报错。
        我们对javap最常用的参数是c,也就是形如 javap -c test 的用法,如果你还想对javap的参数进一步了解的话,
我向你推荐 ‍www.javaresearch.org 的一篇文章《javap简介》,你可以在该网站的首页上通过查询该标题得到这
篇文章。下面我们进入正题:

•第一例
int i = 0;
i=i++ + ++i;

Code:
0:   iconst_0          将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
1:   istore_1          从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 //对应赋值语句,上句是
                          赋值,这句是存储,索引1处即为i,因为没有其它变量,所以本例中局部变量的索引不变
2:   iload_1           将局部变量表索引 1 处的值推到堆栈中//将局部变量索引1处的计算结果推入堆栈临时
                          存储,局部变量的索引从1开始,依此类推,这句意味着将变量i=0先推入堆栈临时存储
3:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //将变量i自加1,则此时变量i为1
6:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //再将变量i自加1,则此时变量i为2
9:   iload_1           将局部变量表索引 1 处的值推到堆栈中//将变量i=2推入堆栈临时存储
10: iadd               从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的
                         整数相加,即0+2=2
11: istore_1        从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处//把上步相加之结果弹出
                          堆栈
12: return             从堆栈中弹出值并将它推到调用方法的操作数栈中。退出方法//将i=2返回,计算结束

•第二例

int i=0;
i = ++i + i++;

Code:
0:   iconst_0          将 0 推到堆栈中//对应赋值语句 int i = 0;iconst_0中的0为初始值
1:   istore_1           从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处 //对应赋值语句,上句
                        是赋值,这句是存储
2:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //将变量i自加1,则此时变量i为1
5:   iload_1          将局部变量表索引 1 处的值推到堆栈中//将变量i=1推入堆栈临时存储
6:   iload_1          将局部变量表索引 1 处的值推到堆栈中//将变量i=1推入堆栈临时存储
7:   iinc    1, 1       局部变量表索引 1 处的变量加 1 //再将变量i自加1,则此时变量i为2
10: iadd               从操作数堆栈中弹出两个整数并让它们相加。将得到的整数推回堆栈中//将两次暂存的
                        整数相加,即0+2=2 注意:虽然上步让i=2,但是并没有推入堆栈作存储
11: istore_1         从堆栈中弹出这个值,并将它存储到局部变量表的索引 1 处//把上步相加之结果弹出堆栈
12: return             从堆栈中弹出值并将它推到调用方法的操作数栈中。退出方法//将i=2返回,计算结束
======================================================================================
      下面给出的是较为复杂一点的例子,供读者自行分析。

int i=0;
i= i++ + ++i;
int j=0;
j= ++j + ++j;

Code:

0:   iconst_0
1:   istore_1
2:   iload_1
3:   iinc    1, 1
6:   iinc    1, 1
9:   iload_1
10: iadd
11: istore_1
12: iconst_0
13: istore_2
14: iinc    2, 1
17: iload_2
18: iinc    2, 1
21: iload_2
22: iadd
23: istore_2
24: return

 

参考资料

‍http://blog.csdn.net/myyate/archive/2007/07/24/1704852.aspx

‍http://www.javaeye.com/topic/466832

‍http://www.examda.com/JAVA/Instructs/050924/095749165.html

‍http://www.examda.com/linux/fudao/20070604/085826447.html

分享到:
评论

相关推荐

    wtl_wtl-implementation_of_javap-master_C++_

    在描述中提到,“使用C/C++实现javap的功能,加深对Java中class结构的理解”,这表明该项目将涉及以下几个核心知识点: 1. **Java Class文件结构**:Java类文件是由一系列字节构成的二进制文件,包含常量池、访问...

    javap-Tool:JAVA项目

    例如,要查看一个名为`MyClass.class`的类,你可以运行`javap -c MyClass`,这会显示出类中的每个方法的字节码指令。 在`javap-Tool-master`这个压缩包中,很可能包含了一个关于如何使用`javap`工具的示例项目或...

    javap使用(1).docx

    `javap` 是 Java 开发工具包 (JDK) 中的一个重要工具,主要用于反编译 `.class` 文件中的字节码。通过 `javap`,开发者能够深入了解 Java 编译器是如何处理源代码并生成字节码的,这对于优化程序性能和理解 Java ...

    javap使用说明文档

    javap 是 JDK 中的一个命令行工具,主要用于对给定的 class 文件进行反编译,了解 Java 编译器内部的工作机制,并提高程序执行的效率。下面是 javap 的使用说明。 1. javap 的基本用法 javap 的基本用法是 javap ...

    jad- java反编译软件

    一个类似于javap的java反编译工具,运行速度快,据说Front End Plus、mDeJava、Decafe Pro、Cavaj Java Decomplier、DJ Java Compiler、NMI's Java Class Viewer等反汇编工具都以jad作为核心引擎,只是在jad内核的...

    jdk-8u144-windows-x64

    Java Development Kit is the official development kit for the ...which displays process information for current Java processes, javap - the class file disassembler, and other components are also included.

    JAVA分章习题库-四川轻化工大学-电子商务系

    - JDK中还包含其他工具,如javap.exe用于反汇编.class文件,jdb.exe是Java调试工具,jre.exe是Java运行时环境等。 以上是四川轻化工大学电子商务系使用的Java练习题中涉及的一些基础知识和概念,这些知识是Java...

    javaclass和源码-deep-in-jvm:简单的借助jdk中的内置工具帮助我们对比Java源码和生成的字节码以及探究Class文件字节

    简单的借助jdk中的内置工具帮助我们对比Java源码和生成的字节码以及探究Class文件字节码结构 使用方法 编写Java源码,如项目目录中的Main.java: 运行javac编译成字节码 javac -g:vars Main.java 编译生成...

    Java的class文件结构介绍以及如何实现javap

    NULL 博文链接:https://bolinyang.iteye.com/blog/1830472

    javap命令的使用技巧

    Java 中 javap 命令的使用技巧 javap 命令是 JDK 自带的一个工具,它可以对代码反编译,也可以查看 Java 编译器生成的字节码,对代码的执行过程进行分析,了解 JVM 内部的工作。javap 命令可以将 class 文件反编译...

    java-class-parser:'javap' 的包装器,用于从 '.class' 文件中读取 java 类信息

    安装$ npm install java-class-parser --save [-g]用法在命令行中: $ jjs-parser ./Model.class Service.class 在节点: var parser = require ( 'java-class-parser' ) ;var clazzes = [ './Config.class' ] ;...

    Java电子教案(PPT)-第1章-Java简介(ppt文档).ppt

    - **其他工具**:如javap用于反汇编class文件,jdb是调试工具,jps查看JVM进程,keytool管理密钥库,jar打包文件,javadoc生成API文档。 5. **学习目标**: - 掌握JDK的下载、安装和配置过程。 - 学会编写、编译...

    JAVA-class编辑器

    类编辑器并非唯一的选择,例如JAD、jadclipse、fernflower等都是知名的反编译工具,而 jclasslib、javap等则是用于查看和分析class文件的工具。每种工具都有其特点和适用场景,选择合适的工具取决于具体需求。 总...

    jad.exe-windows版本,将.class文件反编译为java文件(专业)

    jad.exe-windows版本,将.class文件反编译为java文件(专业) 使用 java自带的javap -p 名称.class反编译的有可能不正确,例如反编译Enum枚举,所以我们需要使用更加专业的工具

    \Java2语言命令详解(PDG).

    `javac` 命令用于将源代码文件(.java)编译成可执行的字节码文件(.class)。例如,要编译名为`HelloWorld.java`的文件,可以使用以下命令: ``` javac HelloWorld.java ``` 2. **java** - Java 运行时环境 ...

    java class文件解析

    5. **反编译工具**:如`javap`命令是Java自带的反汇编工具,可以查看字节码指令,帮助理解代码的运行过程。另外,还有更强大的第三方工具,如JAD、FernFlower等,可以反编译成更接近源代码的形式。 6. **字节码分析...

    java讲义(入门基础)

    - 通过class(Bytecode) loader加载代码,通过Bytecode verifier校验代码的安全性,最后由runtime interpreter执行代码。 4. **多线程**: - Java内置了Thread类,开发者可以通过继承该类轻松编写多线程程序。 - ...

    JAVA程序设计习题库及答案

    - `java.exe`:Java字节码解释器,用于运行编译后的.class文件。 - `javadoc.exe`:Java文档生成器,用于创建API文档。 - `javap.exe`:反汇编器,查看字节码的详细信息。 - `jdb.exe`:Java调试器,帮助开发者...

    Java运行原理 javap命令运行结果

    ### Java运行原理与javap命令运行结果解析 #### 一、Java运行原理概述 Java是一种广泛使用的编程语言,它的程序可以在任何支持Java虚拟机(JVM)的操作系统上运行,而无需重新编译。Java程序的执行过程可以分为...

    JAVA程序设计习题库及答案(下载).pdf

    - JDK工具除了javac.exe和java.exe外,还包括javah.exe、javap.exe和jdb.exe等。 - **答案**:jdb.exe。 12. **程序组成部分**: - Java程序包括源代码文件、编译后的字节码文件、归档工具jar生成的.jar文件和...

Global site tag (gtag.js) - Google Analytics