/**
* javap命令可以对class反汇编得到其字节码文件(此命令并不是jdk8开始的,只不过jdk8中对工具进行加强,增加了一些参数,可通过 javap -help了解)
*
* 注意:
* 字节码文件在虚拟机中是通过栈帧来保存指令的,也称为操作栈,是一个后入先出的栈。并不是针对寄存器的直接操作。
* 字节码执行引擎通过操作站获取指令。
*
* 这个测试同时验证了 ++i 和 i++的区别。
* ++i,在字节码层面,会先进行iinc,也就是执行自增,然后load变量
* i++,则是,先load变量,后自增(因为已经load,所以本次自增,并不会影响已经load的变量值)。
*
* @author zhuotao
*
*/
public class JavapTest {

/**
* 最简单的求和操作,javap反汇编得到的字节码如下:
Code:
0: iload_1 // 第一个int类型变量
1: iload_2 // 第二个int类型变量
2: iadd // 执行int类型的add操作
3: ireturn // 返回int类型
*
*/
public int add(int a, int b) {
  return a+b;
}

/**
* 字节码如下:
* Code:
0: iload_1 // int类型变量
1: iconst_1 // int类型常量1
2: iadd // int类型add
3: ireturn // 返回
* @param a
* @return
*/
public int incr(int a) {
  return a+1;
}

/**
* 字节码如下:
* Code:
0: iload_1 // int类型变量
1: iinc 1, 1 // iinc 局部变量自增 第一个“1” 表示int类型变量索引, 第二个“1”表示+1
4: ireturn // 返回
* @param a
* @return
*/
public int incr1(int a) {
  return a++;
}

/**
* 用两个变量,来验证iinc的参数分别表示什么
* 字节码如下:
* Code:
0: iinc 2, 1 // “2”表示参数列表的第二个参数, "1"表示步长
3: iload_2 // load第二个int类型参数
4: ireturn // 返回load变量
*/
public int incr2(int a, int b) {
  return ++b;
}

/**
* 这个方法字节码同incr2
* 字节码如下:
* Code:
0: iinc 1, 1
3: iload_1
4: ireturn
*/
public int incr3(int a) {
  a++;
  return a;
}

public static void main(String[] args) {
  System.out.println(new JavapTest().incr1(2)); // return a++; 返回的是2,也就是先使用后加。
  System.out.println(new JavapTest().incr2(0,2)); // return ++a; 返回的是3,也就是先加后使用。
  System.out.println(new JavapTest().incr3(2));
}
}

i++ 与 ++i 的从字节码层面看二者的区别的更多相关文章

  1. 从字节码层面看“HelloWorld” (转)

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  2. 从字节码层面看“HelloWorld”

    一.HelloWorld 字节码生成 众所周知,Java 程序是在 JVM 上运行的,不过 JVM 运行的其实不是 Java 语言本身,而是 Java 程序编译成的字节码文件.可能一开始 JVM 是为 ...

  3. 从jvm字节码指令看i=i++和i=++i的区别

    1. 场景的产生 先来看下下面代码展示的两个场景 @Testvoid testIPP() { int i = 0; for (int j = 0; j < 10; j++) { i = i++; ...

  4. i = i++ 在java字节码层面的分析

    有这么一段代码: package zl.test; public class PcodeTest { /** * @param args */ public static void main(Stri ...

  5. 从字节码层面,解析 Java 布尔型的实现原理

    最近在系统回顾学习 Java 虚拟机方面的知识,其中想到一个很有意思的问题:布尔型在虚拟机中到底是什么类型? 要想解答这个问题,我们看 JDK 的源码是无法解决源码的,我们必须深入到 class 文件 ...

  6. 字节码层面深入分析Java枚举类

    枚举类的使用 定义一个简单的枚举类,其中包含若干枚举常量,示例如下: public enum Day { SUNDAY, MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FR ...

  7. Tomcat 调优之从 Linux 内核源码层面看 Tcp backlog

    前两天看到一群里在讨论 Tomcat 参数调优,看到不止一个人说通过 accept-count 来配置线程池大小,我笑了笑,看来其实很多人并不太了解我们用的最多的 WebServer Tomcat,这 ...

  8. 从JVM字节码执行看重载和重写

    Java 重写(Override)与重载(Overload) 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的 ...

  9. 从字节码指令看重写在JVM中的实现

    Java是解释执行的.包含动态链接的特性.都给解析或执行期间提供了非常多灵活扩展的空间.面向对象语言的继承.封装和多态的特性,在JVM中是怎样进行编译.解析,以及通过字节码指令怎样确定方法调用的版本号 ...

随机推荐

  1. 计算机语言的发展(the history of computer's language)

    第一部分 计算机语言的分类: 机器语言:直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码.例如:1011011000000000,表示加法.可以直接执行. 汇编语言:汇编指令集.伪指 ...

  2. 关于oledb对Excel的读取

    这两天项目需求要检索excel的内容,于是就研究了一下,话不多说,我就直接贴代码1.首先是连接excel. public DataTable SearchSheetToDT(string strSea ...

  3. Java---软件试用次数(Properties类的简单使用)

    编程练习(软件试用次数) 实现一个如下的软件小功能: 记录软件运行的次数并在每次运行时提示已经运行的次数.如果运行次数大于5次,软件不再运行并给出提示:试用次数已到,请注册! 本代码只简单的介绍了软件 ...

  4. openstack 使用集锦

  5. floor() 和 ceil()函数

    在C语言的库函数中,floor函数的语法例如以下: #include <math.h> double floor( double arg ); 功能: 函数返回參数不大于arg的最大整数. ...

  6. CString与std::string unicode下相互转化

      1. CString to string CString str = L"test"; CString stra(str.GetBuffer(0)); str.ReleaseB ...

  7. 10 Powerful Apache Modules--reference

    Apache is the most popular web server in the world,because it is more efficient than others.Thrust o ...

  8. android开发之——混淆编译

    众所周知,android的apk文件是非常容易被反编译的,这样对于开发者来说,辛辛苦苦开发应用被破解是一件很令人懊恼的事情,谷歌也认识到了这一点,所以从2.3之后就为开发者提供了一个代码混淆工具pro ...

  9. Mounting File Systems

    1.Mounting File Systems Just creating a partition and putting a file system on it is not enough to s ...

  10. NYOJ -37回文字符串

    这道题看了好大会没有思路,上网一搜发现这么简单,但是我为什么就想不到呢,??就是求和它的逆序之后的字符串最长公共子序列,然后用总的长度减去它就行了.原因是是因为只要是在公共子序列里面,那么他就是对称的 ...