热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java循环读取字节码_java通过字节码指令分析for循环、数组创建

前言这篇文章是在我学习了JVM相关知识之后。明白了我们编写的代码,也就是.java文件会被翻译成.class字节码文件运行在虚拟中。.class文件中其实存放的就是j

前言

这篇文章是在我学习了JVM相关知识之后。明白了我们编写的代码,也就是.java文件会被翻译成.class字节码文件运行在虚拟中。.class文件中其实存放的就是jvm虚拟机认识的一条条指令,指挥着JVM做我们想要他做的事情。但是我们并不清楚,我们的代码最终成为了何种指令?

看次篇博文知识基础

正文

下面就通过代码创建一个简单的for循环、创建数组来研究一下字节码

一个一个来看吧。

for循环

java代码

public void method1(){

for (int i &#61; 0; i <1000; i&#43;&#43;) {

}

}

javap -c 反汇编字节码

public void method1();

Code:

0: iconst_0 加载一个静态常量0到操作数栈

1: istore_1 将操作数栈栈顶的数值加载到局部变量表下标为1的位置上

2: iload_1 将局部变量表下标为1的数值加载到操作数栈中

3: sipush 1000 将常量1000加载到操作数栈

6: if_icmpge 15 比较栈顶两个int类型数值的大小 ,当前者 大于等于 后者时,跳转。(跳出循环)

9: iinc 1, 1 将局部变量表下标为1的数值自增1

12: goto 2 跳转到指令2继续执行(开启循环)

15: return

问题

这里这个if_icmpge 这个指令的解释有点争议&#xff0c;前者后者&#xff0c;到底是代码里的前者后者(i是前者&#xff0c;1000是后者)&#xff0c;还是栈里数据的前者后者(这个就更分不清前后了&#xff0c;最好用栈顶栈底来说)&#xff0c;让人搞不清。

经过我的研究&#xff0c;我将if_icmpge 的解释改为比较栈顶两个int类型数值的大小 ,当栈顶第二个数值(i) 大于等于 栈顶第一个数值(1000)时,跳转。(跳出循环)&#xff0c;执行完此条命令栈顶的两个值会被清空

创建数组

java代码

public void method2(){

String[] array &#61; {"0","1","2"};

}

javap -c 反汇编字节码

public void method2();

Code:

0: iconst_3 将一个常量3加载到操作数栈当中

1: anewarray #2 该指令首先从操作数栈中加载栈定数据(3)&#xff0c;并创建一个大小为该数据的数组&#xff0c;并将该数组的对象引用放入操作数栈中

4: dup 拷贝一份栈顶的值&#xff0c;并将其压栈&#xff0c;例如栈顶的值刚开始为value,执行完为value,value

5: iconst_0 将数值为0的压入操作数栈中

6: ldc #3 将String "0"的字符串引用压入操作数栈当中

8: aastore 执行数组值存放&#xff0c;下面会解释

9: dup

10: iconst_1

11: ldc #4 // String 1

13: aastore

14: dup

15: iconst_2

16: ldc #5 // String 2

18: aastore

19: astore_1 将栈顶的数据(数组array的引用)加载到局部变量表下标为1的位置

20: return

关于aastore

可以参考&#xff1a;博客链接

第一个a表示数组中存放的数据类型&#xff0c;a是reference的意思。

第二个a表示array&#xff0c;表示这是一个数组操作。

store就是将元素存入数组了。

在使用这个aastore时&#xff0c;必须要先入栈数组引用&#xff0c;然后入栈下标index&#xff0c;然后入栈所需要存放的值。这是一种存放数组数据的标准。

可以看到真实的顺序是&#xff0c;先通过anewarray指令new出一个数组对象(array)&#xff0c;并通过dup指令将数组array的引用拷贝了一份压入栈中&#xff0c;此时栈中有两个数组变量ints&#xff0c;然后入栈常量0&#xff0c;表示要操作数组array的下标&#xff0c;然后入栈String“0”的引用&#xff0c;表示要数组中要存放的数据。此时栈底到栈顶的顺序是&#xff1a;array(引用),array(引用),0,"0"。然后调用aastore&#xff0c;执行完清空栈&#xff0c;只留下一个栈底的ints的引用。然后继续执行。



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • JVM:33 如何查看JVM的Full GC日志
    1.示例代码packagecom.webcode;publicclassDemo4{publicstaticvoidmain(String[]args){byte[]arr ... [详细]
  • Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注【程序新视界】。本篇为面试题系列第2篇。常见面试问 ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
author-avatar
尹嫱AileenDawnYin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有