foreach循环也叫增强型的for循环,他是JDK 5.0的新特性(其他特性例如泛型等)

使用方法如下:

for(type element:array){....//coding here
}

其中关于foreach的优势与局限性在迭代(二)文章中都有指出,并且在上一篇文章提出了关于foreach如何具体实现的问题。

我们通过反编译.class文件(语法为:javap -verbose xxxx.class),得到了如下内容:

其实反编译后的信息很多,但是我只截取了最重要的两部分。至于这两部分分别代表什么,我们先来了解java的字节码怎么读取。当我讲述完成的时候,相信也是能够读懂上面信息的时候。

首先我们打开.class文件:显示如下:

很清晰的看到是一连串的十六进制组成,这就是汇编形成的字节码,接下来我们对如何解读字节码进行进一步的分析:

首先,我们来看一副图:

这幅图就是字节码的结构图,组成部分就分别是这么几个,我将分别进行阐述;

1)魔数(Magic Number)

四个字节的魔数,从我给出的.class文件看出,开头的四个字节是cafebabe,当然这是十六进制的数,但是为什么是cafebabe。看看java的图标吧:

2)版本号:

版本号四个字节,前四个为次版本号,后四个为主版本号,在此,值为0x0000 0034,解析出来就是次版本号为0,主版本号为52;那么,从反编译出来的第一幅图可以看到:

这就是反编译出来的版本号,与我们分析的一致;

至此,前八个字节很简单就被我们分析出来了。

3)常量池

接着就是常量池入口。

常量池是class文件中的资源仓库,主要包括两大类:字面量和符号引用。字面量如文本字符串,java申明中为final的值,而符号引用入类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符。 具体怎么实现在内存内存中,则是虚拟机的工作,我们这里还是不要深入比较好。

在进行常量池分析的时候,我们先了解常量池类型表:

上面描述了11中数据类型的结构,但是jdk1.7后又增加了三种,分别是(CONSTANT_MethodHandle_info,CONSTANT_MethodType_info以及CONSTANT_InvokeDynamic_info)算起来一共是14中,接下来按照demo码对他们进行解答:

0x0048:这是紧接着版本号的,因为常量池的数量不一定,所以我们在入口的时候需要定义一个u2类型的数据来记录到底有多少个常量池,该十六进制表示有71个常量池,这里要注意:该十六进制转换数值为72,但是实际只有71个常量池!! 缩影范围为1-71,第0项被设计者规定空留出来了,这是.class文件格式所规定的。

所以我们接下来要翻译71个常量池。(不可能的,我举例子出来能够引用就可以了):

#1: 0x07:tag值为7:class-info,一个U2类型缩影为:0x0002,即#2;

#2:0x01:tag值为1:utf-8info,长度:0x0019:byte长度其实就是这个描述的具体内容,是从一个字节大小扩展出去的。应该是25个字节(0x0019)。还记得我们使用16进制打开的.class文件么?旁边有一串字符,其中包含乱码,中间的某些字符串和16进制的值时一一对应的,采用的asc码。所以,这一段字符的值和16进制对应关系如截图所示:

当然长度只有25字节,所以在25字节过后,是下一个常量池信息了!也就是在07及其以后的数值已经是下一个常量池了。

上面两个例子其实就可以很好的解释了,我这个例子的常量池有点长,我这里给出另外一位博主的网站地址,他所举出的例子是很详细的。http://www.importnew.com/24088.html。

我们可以看到,我们自己分析的结果其实就是反编译出来的结果的第一部分。

4)Access_Flag访问标志:

访问标志信息包括这个.class文件是类还是接口,是不是public,是不是abstract,如果是类是否被声明成final:

下面给出这个标志表格:

而我们在给出的.class文件中会发现,此处的标志信息为0x0021。这其实是很简单,0x0020与0x0001的并集。即包含了两个标志信息,这里汇编器自动将这个类归类为超类。

5)类索引

类索引引用与确定类的全限定名

0x0001表示引用第一个索引,就是:#1.#2.iteretorTest/TestIterator.

6)超类索引

与类索引一致,确定超类的全限定名

0x0003表示引用第三个索引,就是:#3.#4. java/lang/Object;

7)接口索引

可以看到接口索引为2+n个字节,而我们的测试程序没有应用接口,所以我们的前两个字节是0x0000。那么,也不存在n的情况。但是如果有接口,这个时候后面直接跟着接口的索引。

8)字段表集合

字段表用于描述类和接口中声明的变量。这里的字段包含了类级别变量以及实例变量,但是不包括方法内部声明的局部变量。

而且,字段表也是2+n个字节,在本文的例子中,我们没有变量,所以在.class文件中,这里为0x0000;

但是,实际上,很多情况下都会涉及到包含变量。

这个时候,我们给出字段表集合,来对这段字段进行分析;

同样,用上面给出博主的文章中的例子可以在此分析一下。

下面就是方法,我们将在下一篇文章中写出,方法的解析就会相交前面的复杂很多,其中某些字符的含义需要单独解释,例如<init>,()V,我将会用一个单独的篇章进行方法的字节码解析。

转载于:https://www.cnblogs.com/DSNFZ/articles/7599627.html

java--迭代(三)foreach解析与字节码相关推荐

  1. 第 1 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)

    第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师, 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却 ...

  2. Java简单的生成/解析二维码(zxing qrcode)

    Hi I'm Shendi Java简单的生成/解析二维码(zxing qrcode) 在之前使用 qrcode.js 方式生成二维码,但在不同设备上难免会有一些兼容问题,于是改为后端(Java)生成 ...

  3. Java实现生成和解析二维码

    Java实现生成和解析二维码 文章目录 Java实现生成和解析二维码 一.建立项目 二.创建工具类 三.创建启动类 一.建立项目 首先需要创建一个普通的 Maven 项目,在这里我用的是 google ...

  4. JVM 学习笔记(三)类加载与字节码技术内存模型

    四.类加载与字节码技术 1.类文件结构 通过 javac 类名.java 编译 java 文件后,会生成一个 .class 的文件! 以下是字节码文件: 0000000 ca fe ba be 00 ...

  5. 大多数程序员都懂的java虚拟机:C1编译器从字节码到HIR

    从字节码到HIR 正如之前看到的,C1的HIR是一个基于静态单赋值的图IR,由基本块构成控制流图,由静态单赋值指令构成基本块,如图8-1所示. 所有的指令都派生自Instruction类,其中,Blo ...

  6. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  7. Java 基础巩固:内部类的字节码学习和实战使用场景

    文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 读完本文你将了解: 背景介绍 四种内部类介绍 成员内部类 静态内部类 局部内部类 ...

  8. java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?

    比如,有的java源程序生成一个字节码文件,带有内部类的生成两个.可是有一种情况怎么回事呢?importjava.awt.*;importjavax.swing.*;importjava.awt.ev ...

  9. Java进阶:图文并茂解析HashMap源码

    1. 概要 这篇文章主要从初始化.添加元素.容量resize这几个角度,讲解HashMap的实现原理 2. HashMap核心属性 Node数组,这是HashMap底层存放数据的地方,我们调用put添 ...

最新文章

  1. golang 切片 slice 去掉重复元素
  2. python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
  3. 算法竞赛训练指南代码仓库_数据仓库综合指南
  4. Leetcode--42.接雨水
  5. Tensorflow代码解析(一)
  6. 响应式布局及bootstrap(实例)
  7. 趣文:如果像招聘程序员那样招聘木匠
  8. MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题
  9. 【Python】keras使用Lenet5识别mnist
  10. linux教程第四版第一章,第一章linux shell入门
  11. ArcGIS版本更新对比
  12. GB50311-2016标准综合布线
  13. 常用小样本数据集介绍与下载汇总
  14. 名人博客VS 博客名人
  15. Redis的前前后后左左右右
  16. java for 代表什么意思_java中for是什么意思?
  17. 《心经》经典段落及释义
  18. Android_聊天_表情
  19. 网易云音乐 音乐外链
  20. 深圳市住房公积金提取办法

热门文章

  1. SQL Server实际执行计划COST欺骗案例
  2. finally中关闭资源
  3. 基础学习day03---程序结构与控制、函数与数组入门
  4. 陈天桥:为何总是半夜惊醒?《前程密码》
  5. java 外观模式_Java设计模式11:外观模式
  6. mysql自动备份linux_Mysql for linux mysql自动备份脚本
  7. 运用计算机怎么实现自动化,如何用计算机串口实现自动化控制
  8. c语言 10^30,^ 在C语言中是什么意思?
  9. windows启动管理器怎么修复计算机,如果启动管理器丢失怎么办
  10. 疯狂python讲义pdf_重磅!Python再次第一,Java和C下降,凭什么?