类文件结构public class TestClass {private int m;public int inc() {return m + 1; }}1.魔数 每个Class文件的头四个字节被称为 2.版本号 紧接着后四位是Class文件的版本号,第五和第六表示次版本号MinorVersion,第七和第八表示主版本号Major Version。 TestClass.java"4.访问标志 在常量池之后就是2个字节代表访问标志 access_flags。 )的数据,interfaces是一组u2类型数据集合,由这三项确定该类的继承关系。 又印证了java会给每一个类隐式定义一个构造方法。 而我的方法明明没有参数,为什么又有Arg_size=1呢?
本文,我们编写JAVA程序来解析class文件,读者注意,阅读本文前先详细了解Class文件结构,可参考笔者前一篇文章:Class文件结构(1)—手动解析每一个字节,你看不懂 代码地址:https 先定义对应class文件结构中各项的类型,如常量池、字段表、方法表、属性表、U2、U4,再定义各项的解析器,并使用责任链模式完成class文件结构各项的解析工作。 在创建完各常量结构对应的Java类,和实现各常量结构的解析方法后,我们再来完成整个常量池的解析工作。 解析class文件的访问标志 Class文件结构中的访问标志项access_flags是用U2类型存储的,也就是2个字节。用某个bit位的值是否为1判断该类或接口的访问权限、属性。 解析this与super 在Class文件结构中,紧挨着访问标志access_flags项的是this_class和super_class这两项,也都是U2类型。
Class文件是以8位字节为基础单位的二进制流,各部分中间没有分隔符。遇到8位字节以上的空间数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。 Class文件采用类似C语言的伪结构体来存储,这种伪结构体只有两种数据类型:无符号数和表。无符号数以u1,u2,u4,u8四种,数字代表字节数。 表用于描述有层次关系的复合结构数据,整个Class文件本质上就是一张表。 ,共有14总结构各不相同的表结构数据,这11种表都有一个共同的特点,就是表开始第一位是一个u1类型的标志位(tag,取值为1置12,缺少标志为2的数据类型),14种常量具体含义如下: 类型 标志 描述 因为Java不支持多重继承,所以父类索引只有一个,除了java.lang.Object外,所有Java类都有父类,因此除了java.lang.Object,所有java类的父类索引都不为0。
在这篇文章中我们来一起看一下 class 文件的结构,来进一步加深我们对虚拟机的类加载机制和类机制的理解。本文参考了 《深入理解 Java 虚拟机》一书。 解析 .class 文件 我们都知道一个 Java 类(.java)文件在被 Java 编译器(javac) 编译过后,如果语法没有错误,则会生成一个对应的 .class 文件,这个 .class 文件是一个二进制文件,用一定的格式保存了我们书写的类的所有信息。 除了 ConstantValue 以外,Java 虚拟机还有很多其他类型的属性表,最常见的便是 Code 表,它的结构我们在分析类文件中的方法属性时会介绍,如果虚拟机在进行属性表解析时发现属性表名不是其可以识别 其实 验证过程是最复杂的,因为这个过程需要扫描整个在加载过程中得到得到的 .class 文件格式的二进制数据,也就是相当于将我们在上面模拟的解析 .class 文件的过程,并且判断相关的数据是否合法,比如文件的魔数是否为
number in .class file 就是由于JDK1.6编译的文件版本号超过了JDK1.5虚拟机所接受的范围 Java class文件是二进制文件。 Class类文件结构 class文件的结构 简单讲,jvm的class文件是针对jvm的私家定制。只要运行在jvm上byte code,都需要按照class文件format来。否则jvm解析不了。 官网文档: The Java Virtual Machine class file format class文件时java虚拟机执行引擎的数据入口,也是java技术体系的基础支柱之一,了解class文件的结构对后面进一步了解虚拟机执行引擎有很重要的意义 class文件是一组以八位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在 Class文件中,类的全限定名、字段、方法都是使用CONSTANT_Utf8_info类型常量来描述名称,而该常量的长度由2个字节表示,所以类的全限定名、字段名、方法名的最大长度不能超过2个字节所能表示的最大整数
.*; import java.io.*; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util .*; /** * 使用Java的mail包解析 标准的 .eml格式的邮件文件 * * @author * @date 2019/08/07 */ public class EmlUtil HashMap<>(); parserFile(file.getAbsolutePath()); return result; } /** * 解析文件 map.put("type", msg.getContentType()); } return map; } /** * 解析内容 mbp.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart String dspName = file.length < 2
java的运行过程 在运行一段java代码的时候需要经过编译,验证,加载和运行,具体如下图: ? 这个系列的文章是为了探讨Java字节码是什么样的结构,如何能够准确的表达我们代码的含义。 ---- JDK中如何解析class文件 在原生的JDK中有对java字节码的读取的工具类com.sun.tools,具体使用如下: File file=new File("/Users/fuwei/work class文件的基本结构 根据JVM的虚拟机规范(SE8)提供的资料,字节码对应的结构体如下: ClassFile { u4 magic; u2 在我们了解了class的结构之后,就可以开始试着解析class文件。 解析过程 读取类文件 private DataInputStream dataInputStream; public ClassReadCursor(String filePath) {
本文将为你介绍如果使用Java的Scanner类来读取或者解析CSV文件。 我的CSV文件(user.csv)内容如下 Rockey,22,India Bill,23,US Sonia,23,Germany 接下来我们首先从创建映射上述属性的实体User.java public ,本例中我们采用文件的方式。 CSVParsingExample.java import java.io.File; import java.io.IOException; import java.util.ArrayList; import data); } else if (index == 1){ user.setAge(Integer.parseInt(data)); } else if (index == 2)
Java虚拟机不和包括Java在内任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。 二.Class文件结构 根据Java虚拟机规范,类文件由单个ClassFile结构组成: ClassFile{ u4 magic; //Class 文件的标志 u2 } 根据Java虚拟机规范规定,Class文件格式采用一种类似C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号和表 无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1 当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建或运行时解析并翻译到具体的内存地址中。 ;//接口 u2 interfaces[interfaces_count];//一个类可以实现多个接口 类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名,由于 Java 语言的单继承
我们可以查看上述字节码的二进制文件用16进制查看: ? 字节码的二进制文件对应表示为: CA FE BA BE 00 00 00 34 那么前面的cafebabe就是魔数,而0000 和0034则分别是主版本号和次版本号。 除了java.lang.Object类之外所有类都有父类,故除了java.lang.Object类之外,所有类该字段值都不为0) interfaces_count 2个字节 接口索引计数器,如果该类没有实现任何接口 方法表结构和字段表结构一样: 类型 名称 数量 u2 access_flags 1 u2 name_index 1 u2 descriptor_index 1 u2 attributes_count 1 的内容,#12 即常量池中的HelloByteCode.java 这个类属性值表示的内容为: SourceFile: "HelloByteCode.java" 至此,我们完整解析了class类的字节码
“ 我们都知道Java虚拟机不和包括Java在的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联。而Class文件是由java文件经过javac编译器编译后生成的。” ? 01 — Class类文件结构 在深入理解Java虚拟机一书中是先介绍概念然后具体分析,这里我就反过来描述,我们先看一下class文件,这里我打开一个本地被编译过的class文件,我们看到它是乱码的。 类和接口的全限定名 2. 字段的名称和描述符 3. 方法的名称和描述符 那常量池入口之后的十六进制表示什么呢? 当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析并翻译到具体的内存地址之中。 Java虚拟机规范规定,Class文件格式采用类似C语言结构体的伪结构来存储数据,这种结构只有两种数据类型:无符号数和表
2、class 字节码文件介绍 搞清楚了Java代码的跨平台原理,我们接着来介绍为什么编写的Java代码能够被计算机所识别。 而 class 文件便是一组以 8 位字节为基础单位流的二进制流,各个数据项目严格按照顺序紧凑地排列在 class 文件之中,中间没有添加任何分隔符,所以整个class 文件中存储的内容几乎都是程序运行的必要数据 当虚拟机运行时,需要从常量池获得对应的符号引用,再在类创建时或运行时解析并翻译到具体的内存地址之中。关于类的创建和动态连接的内容,下篇博客会详细介绍。 父类索引:用于确定这个类的父类全限类名,也是一个 u2 类型的数据。因为Java是单继承的,除了 java.lang.Object 类以外,所有的类都有父类。 所以,除了Object 类以外,所有Java类的父类索引都不为0. 接口索引:用于描述这个类实现了哪些接口,是一组 u2 类型的数据集合,第一项为 u2 类型的接口计数器,表示实现接口的个数。
Java虚拟机不和特定的语言绑定,它只与 “Class文件” 这种特定的二进制文件格式所关联。Class文件中包含了 Java虚拟机指令集和符号表以及若干其他辅助信息。 Class 类文件的结构 ---- Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class文件之中,中间没有任何分隔符,这使得整个 Class文件中存储的内容几乎全部是程序运行的必要数据 Java虚拟机规范中规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都要以这两种数据类型为基础,所以这里先介绍这两个概念。 根据 Java 虚拟机规范,类文件由单个 ClassFile 结构组成: ClassFile { u4 magic; //Class 文件的标志 u2 类索引、父类索引与接口索引集合 ---- 类索引和父类索引都是一个 u2类型的数据( Java 语言的单继承,所以父类索引只有一个,除了 java.lang.Object 之外,所有 Java 类的父类索引都不为
通过 Dockerfile 开发人员可以快速创建自定义镜像,这篇文章就为大家来介绍一下 Dockerfile的文件结构 Dockerfile 内容包含四部分: 基础镜像信息 维护者信息 镜像操作指令 容器启动时执行的指令 下面我们通过一个 Dockerfile 文件来具体讲解一下: # 这个 Dockerfile 是基于 ubuntu:xeniel 镜像来创建容器 FROM ubuntu:xeniel nginx RUN echo "\ndaemi off;">>/etc/nginx/nginx.conf CMD /usr/sbin/nginx 第一行通过注释的方式描述了这个 Dockerfile 文件是基于
从这篇开始,我们将一起来看一下 Java 集合框架中一些具体的类的解析,了解它们的运行原理。先从 List 接口下的相关类开始。 ? 而官方解释也说了这个类提供了 List 接口的骨架实现,以最大化减轻子类实现线性结构相关数据结构所需的工作量。 最后,上面 AbstractList 类的 subList 方法中出现了 SubList 类和 RandomAccessSubList 类的身影,这两个类是 AbstractList.java 文件中的非 public 型的类,并且这两个类是继承了 AbstractList 类的,既然是非 public 类型的类,也就是说我们在外面不能直接使用这两个类,只能在同类文件和相同包内的类中使用(其实我们就是不能直接用 好了,这篇文章我们一起看了一下 AbstractCollection 、AbstractList 类,并对相关涉及到的类进行了解析,也是为接下来打好了基础,下篇文章我们将一起来解析一些常用的线性结构具体类
如果你也和我一样,不了解类结构和类加载,但是工作中又涉及到字节码相关内容,相信后面两篇文章会对你有所帮助。 我们所编写的每一行代码,要在机器上运行最终都需要编译成二进制的机器码 CPU 才能识别。 它们和 Java 语言一样都会被编译器编译成字节码文件,然后由虚拟机来执行。所以说类文件(字节码文件)具有语言无关性。 二. Class 文件结构 Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据严格按照顺序紧凑的排列在 Class 文件中,中间无任何分隔符,这使得整个 Class 文件中存储的内容几乎全部都是程序运行的必要数据 Java 虚拟机规范规定 Class 文件格式采用一种类似与 C 语言结构体的微结构体来存储数据,这种伪结构体中只有两种数据类型:无符号数和表。 建议想要深入了解的同学可以自己动手将 Java 类编译成二进制字节码文件,根据文章里介绍的类文件结构逐个字符去对照和实验,有助于加深理解。
如果你也和我一样,不了解类结构和类加载,但是工作中又涉及到字节码相关内容,相信后面两篇文章会对你有所帮助。 我们所编写的每一行代码,要在机器上运行最终都需要编译成二进制的机器码 CPU 才能识别。 Class 文件结构 Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据严格按照顺序紧凑的排列在 Class 文件中,中间无任何分隔符,这使得整个 Class 文件中存储的内容几乎全部都是程序运行的必要数据 Java 虚拟机规范规定 Class 文件格式采用一种类似与 C 语言结构体的微结构体来存储数据,这种伪结构体中只有两种数据类型:无符号数和表。 建议想要深入了解的同学可以自己动手将 Java 类编译成二进制字节码文件,根据文章里介绍的类文件结构逐个字符去对照和实验,有助于加深理解。 关于「类文件结构」我们就介绍到这里,下一篇我们来聊聊「虚拟机的类加载机制」。 参考资料: 《深入理解 Java 虚拟机:JVM 高级特性与最佳实践(第 2 版)》 ----
Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。 任一门功能性语言都可以表示为一个能被Java虚拟机所接受的有效的Class文件,所以虚拟机并不关系Class的来源是何种语言2.Class类文件的结构任何一个Class文件都对应着唯一一个类或接口的定义信息 Class文件说一组以8位字节为基础单位的二进制流,各个数据项目严格的按照顺序紧凑地排列在Class文件中,中间没有任何分隔符,所以Class文件中存储的内容几乎都是程序运行的必要数据,没有空隙存在当遇到需要占用 当虚拟机运行时,,需要从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。 2.4类索引、父类索引、与接口索引集合类索引、父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。
类文件结构JVM 的“无关性” 谈论 JVM 的无关性,主要有以下两个:平台无关性:任何操作系统都能运行 Java 代码语言无关性: JVM 能运行除 Java 以外的其他代码Java 源代码首先需要使用 Class 文件结构 Class 文件是二进制文件,它的内容具有严格的规范,文件中没有任何空格,全都是连续的 0/1。Class 文件 中的所有内容被分为两种类型:无符号数、表。 类索引、父类索引、接口索引集合类索引和父类索引都是一个 u2 类型的数据,而接口索引集合是一组 u2 类型的数据的集合,Class 文件中由这三项数据来确定类的继承关系。 由于 Java 不允许多重继承,所以父类索引只有一个,除了 java.lang.Object 之外,所有的 Java 类都有父类,因此除了 java.lang.Object 外,所有 Java 类的父类索引都不为 字段表结构如下:类型名称数量说明u2access_flags1字段的访问标志,与类稍有不同u2name_index1字段名字的索引u2descriptor_index1描述符,用于描述字段的数据类型。
首先来了解下Java代码的运行过程:Java源代码首先需要使用Javac编译器编译成class文件,然后启动JVM执行class文件,从而程序开始运行。 Class文件是JVM的输入, Java虚拟机规范中定义了Class文件的结构。Class文件是JVM实现平台无关、技术无关的基础。 2 纵观Class文件结构 根据 JVM 规范,Class 文件通过 ClassFile 定义: ClassFile { u4 magic; // Class 文件的标志 Java程序执行的字节码,数据严格按照格式紧凑排列在class文件中的二进制流,中间无任何分隔符。 下图展示为16进制 class文件是一组以8字节为单位的二进制字节流,对于占用空间大于8字节的数据项,按照高位在前的方式分割成多个8字节进行存储。