javap是sun提供的对class文件进行反编译的工具,javap就和javac、java等命令用法类似。

javap最常用的参数是c,也就是javap -c test 其中,test是test.java文件经javac编译后产生的class文件名一个例子

public class TestJavap {

public static void main(String[] args) {

int i=0;

i = i++ + ++i;

System.out.println(i);

}

}

$ javac TestJavap.java

$ javap -c TestJavap

Compiled from "TestJavap.java"

public class TestJavap extends java.lang.Object{

public TestJavap();

Code:

0:  aload_0

1:  invokespecial  #1; //Method java/lang/Object."":()V

4:  return

public static void main(java.lang.String[]);

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:  getstatic      #2; //Field java/lang/System.out:Ljava/io/PrintStream;

15:  iload_1

16:  invokevirtual  #3; //Method java/io/PrintStream.println:(I)V

19:  return

解释如下

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:  getstatic       #2; //Field java/lang/System.out:Ljava/io/PrintStream;  对应System.out

15:  iload_1            加载i//将变量i=2推入堆栈临时存储

16:  invokevirtual   #3; //Method java/io/PrintStream.println:(I)V            对应println

19:  return             退出方法

---------------------

作者:csdn

来源:CSDN

原文:https://blog.csdn.net/shangpusp/article/details/7320333?utm_source=copy

版权声明:本文为博主原创文章,转载请附上博文链接!

java中p,javap -c相关推荐

  1. Java 中的语法糖,真甜。

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 我们在日常开发中经常会使用到诸如泛型.自动拆箱和装箱.内部 ...

  2. Java中的锁原理、锁优化、CAS、AQS详解

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:景小财 www.jianshu.com/p/e674ee68 ...

  3. Java 中关于 try、catch、finally 中的细节分析

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:God Is Coder https://www.cnblo ...

  4. java中class对象的理解 讲得相当不错 很接地气 引用下

    https://blog.csdn.net/mcryeasy/article/details/52344729 https://blog.csdn.net/dufufd/article/details ...

  5. 【转】在Java中连接字符串时是使用+号还是使用StringBuilder StringBuffer 加号

    字符串是Java程序中最常用的一种数据结构之一.在Java中的String类已经重载的"+".也就是说,字符串可以直接使用"+"进行连接,如下面代码所示: St ...

  6. java包装类和基本类型谁先谁后_你知道Java中基本类型和包装类的区别吗

    前情提要 上一篇中,通过一道常见的面试题(即:String.StringBuilder.StringBuffer的区别),引申到Java中基本类型和包装类的相关内容.在这一篇中,我们将解决上一篇中引申 ...

  7. 在Java中使用final关键字可以提高性能吗?

    本文翻译自:Does use of final keyword in Java improve the performance? In Java we see lots of places where ...

  8. 在Java中连接字符串时是使用+号还是使用StringBuilder

    字符串是Java程序中最常用的一种数据结构之一.在Java中的String类已经重载的"+".也就是说,字符串可以直接使用"+"进行连接,如下面代码所示: St ...

  9. 好好说说Java中的常量池之Class常量池

    前言 在Java中,常量池的概念想必很多人都听说过.这也是面试中比较常考的题目之一.在Java有关的面试题中,一般习惯通过String的有关问题来考察面试者对于常量池的知识的理解,几道简单的Strin ...

最新文章

  1. VLFeat开源库介绍及在VS2013中的编译
  2. uva 147 Dollars(完全背包)
  3. linux之SQL语句简明教程---IN
  4. 程序高手和菜鸟的区别是什么?
  5. Modbus通信协议之CRC16冗余循环校验函数
  6. 经过5年的娱乐功能,编码传奇MPJ踏上了他的下一个大旅程
  7. ORACLE PL/SQ入门
  8. 数据结构与算法 3:二叉树,遍历,创建,释放,拷贝,求高度,面试,线索树
  9. leetcode 617. 合并二叉树(Merge Two Binary Trees)
  10. 文件备份软件 FreeFileSync
  11. 计算机键盘灯光怎么关闭,电脑关机键盘灯一直亮着解决方法
  12. win7虚拟机详细搭建过程
  13. 互联网产品经理必备文档介绍
  14. Openfire 即时通讯系统(服务器端+Android客户端)一
  15. php 游戏开发swoole,《基于 Swoole 的对战游戏实践》开课啦
  16. UCOSII操作系统(四)--任务管理
  17. chrome安装vysor webgl不支持
  18. 如何查看计算机用户的密码,电脑密码如何查看? 教您查看方法
  19. 智慧城市时代,哈啰出行定点停车正成为城市共享单车运维新标准
  20. java单机RPG,java单机rpg游戏人物对白如何保存的

热门文章

  1. qt 使用插件astyle_为Qt Creator 开发astyle代码格式化插件
  2. [C语言]八皇后问题回溯算法
  3. 星球年度汇总-爬虫获取基金持仓明细(附GUI可拿来就用}
  4. go time包详解
  5. 【js】window.location.href的相对路径和绝对路径
  6. (tensorflow学习) Deep Dream原理及实现
  7. 交换机与集线器(HUB)抓包上的区别
  8. Java枚举,如何通过code获取枚举?
  9. JAVA代码学习之芋道源码
  10. 【PDF操作】简单的PDF文档签名开源工具