java--迭代(三)foreach解析与字节码
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 章 一 JVM 和 Java 体系架构 (虚拟机介绍、字节码、Java跨平台性)
第 1 章 JVM 和 Java 体系架构 1.JVM 前言 作为Java工程师, 你是否也遇到过这些问题? 运行着的线上系统突然卡死,系统无法访问,甚至直接OOM! 想解决线上JVM GC问题,但却 ...
- Java简单的生成/解析二维码(zxing qrcode)
Hi I'm Shendi Java简单的生成/解析二维码(zxing qrcode) 在之前使用 qrcode.js 方式生成二维码,但在不同设备上难免会有一些兼容问题,于是改为后端(Java)生成 ...
- Java实现生成和解析二维码
Java实现生成和解析二维码 文章目录 Java实现生成和解析二维码 一.建立项目 二.创建工具类 三.创建启动类 一.建立项目 首先需要创建一个普通的 Maven 项目,在这里我用的是 google ...
- JVM 学习笔记(三)类加载与字节码技术内存模型
四.类加载与字节码技术 1.类文件结构 通过 javac 类名.java 编译 java 文件后,会生成一个 .class 的文件! 以下是字节码文件: 0000000 ca fe ba be 00 ...
- 大多数程序员都懂的java虚拟机:C1编译器从字节码到HIR
从字节码到HIR 正如之前看到的,C1的HIR是一个基于静态单赋值的图IR,由基本块构成控制流图,由静态单赋值指令构成基本块,如图8-1所示. 所有的指令都派生自Instruction类,其中,Blo ...
- Java指令全集_Java的JVM字节码指令集详解
本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...
- Java 基础巩固:内部类的字节码学习和实战使用场景
文章出自:安卓进阶学习指南 主要贡献者: Cloud9527 Alex_赵 Struggle shixinzhang 读完本文你将了解: 背景介绍 四种内部类介绍 成员内部类 静态内部类 局部内部类 ...
- java编译后生成字节码_请问java源文件编译后怎么生成字节码文件?
比如,有的java源程序生成一个字节码文件,带有内部类的生成两个.可是有一种情况怎么回事呢?importjava.awt.*;importjavax.swing.*;importjava.awt.ev ...
- Java进阶:图文并茂解析HashMap源码
1. 概要 这篇文章主要从初始化.添加元素.容量resize这几个角度,讲解HashMap的实现原理 2. HashMap核心属性 Node数组,这是HashMap底层存放数据的地方,我们调用put添 ...
最新文章
- golang 切片 slice 去掉重复元素
- python在线投票系统 统计票数_python投票统计程序,统计序列中各个数值的份数,字典的应用。...
- 算法竞赛训练指南代码仓库_数据仓库综合指南
- Leetcode--42.接雨水
- Tensorflow代码解析(一)
- 响应式布局及bootstrap(实例)
- 趣文:如果像招聘程序员那样招聘木匠
- MySQL把一个大表拆分多个表后,如何解决跨表查询效率问题
- 【Python】keras使用Lenet5识别mnist
- linux教程第四版第一章,第一章linux shell入门
- ArcGIS版本更新对比
- GB50311-2016标准综合布线
- 常用小样本数据集介绍与下载汇总
- 名人博客VS 博客名人
- Redis的前前后后左左右右
- java for 代表什么意思_java中for是什么意思?
- 《心经》经典段落及释义
- Android_聊天_表情
- 网易云音乐 音乐外链
- 深圳市住房公积金提取办法
热门文章
- SQL Server实际执行计划COST欺骗案例
- finally中关闭资源
- 基础学习day03---程序结构与控制、函数与数组入门
- 陈天桥:为何总是半夜惊醒?《前程密码》
- java 外观模式_Java设计模式11:外观模式
- mysql自动备份linux_Mysql for linux mysql自动备份脚本
- 运用计算机怎么实现自动化,如何用计算机串口实现自动化控制
- c语言 10^30,^ 在C语言中是什么意思?
- windows启动管理器怎么修复计算机,如果启动管理器丢失怎么办
- 疯狂python讲义pdf_重磅!Python再次第一,Java和C下降,凭什么?