学习
实践
活动
专区
工具
TVP
写文章

Class文件结构(2)——用java代码实现解析Class文件

本文,我们编写JAVA程序来解析class文件,读者注意,阅读本文前先详细了解Class文件结构,可参考笔者前一篇文章:Class文件结构(1)—手动解析每一个字节,你看不懂 代码地址:https analysis方法的入参是class文件内容的字节缓存,从class文件中读取而来。 文件"); } } } 3.解析版本号 class文件结构的版本号分为主版本号和副版本号,它们共同构成class文件格式的版本号[1]。 该class文件字节缓存与class文件结构各项解析器使用的是同一个缓存对象,都是从同一个class文件读取到内存中的ByteBuffer对象。 懂的都懂,一定要结合我前面的文章看,通过编写一个简单的Class文件结构解析工具项目,不仅对Class文件结构有了深刻的了解,还能自己实现Class文件结构的解析。

1.2K10
  • 广告
    关闭

    618夏日盛惠

    2核2G云服务器首年95元,GPU云服务器低至9.93元/天,还有更多云产品低至0.1折…

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Class文件加载过程

    JVM系列笔记目录 虚拟机的基础概念 class文件结构 class文件加载过程 jvm内存模型 JVM常用指令 GC与调优 Class文件加载过程 JVM加载Class文件主要分3个过程:Loading 、Linking、Initialzing 1.Loading Loading的过程就是通过类加载器将 .class 文件加载到jvm内存中过程。 loadClass() Class执行方式 Class执行方式分为3种:解释执行、编译执行、混合执行,各有优缺点,可通过参数指定。 Vertification:验证Class文件是否符合JVM规定。 思考方向, class 文件load到内存,给静态变量赋默认值,再赋初始值,new 对象的时候,首先要申请内存空间,然后给成员变量赋默认值,接下来给成员变量赋初始值,这个过程中对象有可能处于半初始化状态

    51330

    Class文件结构

    “ 我们都知道Java虚拟机不和包括Java在的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联。而Class文件是由java文件经过javac编译器编译后生成的。” ? 01 — Class文件结构 在深入理解Java虚拟机一书中是先介绍概念然后具体分析,这里我就反过来描述,我们先看一下class文件,这里我打开一个本地被编译过的class文件,我们看到它是乱码的。 开头,那它就肯定不是Java class文件文件,但是不能低版本JDK运行高版本编译后的Class文件,即时文件格式并未发生任何变化,Java虚拟机也必须拒绝执行超过其版本号的Class文件Class文件是一组以8字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑排列在class文件中,中间没有任何分隔符,这使得class文件中存储的内容几乎全部是程序运行的必要程序。

    43120

    Class文件结构介绍

    访问标志   在常量池结束后,紧接着的两个字节代表访问标志(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口,是否定义为public类型,是否定义为 类索引,父类索引与接口索引集合   类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,接口索引计数器也是一个u2类型的数据,接口索引集合则是一组u2类型的数据集合 ,Class文件中的这几项数据来确定这个类的继承关系 类索引   确定当前类的全限定名 ? 由于java单继承的原则,所以父类只可能有一个;由于Object是所有其他类的基类,所以除了Object类本身的super_class为0意外,其余的所有类的super_class都不为0. ? 小结:   类索引的直接值,父类索引的直接值,接口索引集合中的索引的直接值,代表的是一个常量池中的索引值,该索引值对应为一个CONSTANT_Class_info , CONSTANT_Class_info

    41630

    Class文件结构介绍

    概述  常量池是紧接着主次版本号之后出现的,常量池可以理解为class文件之中的资源仓库,它是Class文件结构中与其他项目管理最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在 Class文件中第一个出现的表类型数据项目。 案例代码还是和前一篇的一样,如下:public class Test { private int a; public int run(){ System.out.println(波波烤鸭); return 常量池中存储着最基本的信息,不仅程序会用到,而且Class文件本身也会通过#来引用 ? 文件中引导方法表的bootstrap methods[]数组的有效索引 name_and_type_index u2 值必须是对当前常量池的有效索引,常量池在该处的索引必须是CONSTANT_NameAndType_info

    77530

    Class文件字段表

    在经历过了魔数(u4)、文件版本(u2+u2)、常量池(u2(常量池元素的数量)+具体字节数)、类访问标记(u2)、类索引(u2)、父类索引(u2)、接口(u2(接口的数量) + 具体的字节数)之后,我们便进入了类的内部 实例分析 public class ClassTest { private transient int m; private int inc() { return m 首先前两个字节0x0001,通过这里我们知道该class文件有一个字段,其中他的访问标志是0x0002,说明该字段是个private字段,该字段的简单名称在常量池的索引为0x0005,通过下图(javap -v 反编译的class文件)我们可以看出常量池中的第5项是m,该字段段的描述符为0x0006,在常量池重视个I,说明该字段的数据类型为int,紧接着后面该是该字段的属性表,该字段没有属性表,因此是0x0000

    39510

    Class文件结构介绍

    属性表   在前面的内容中属性表(attribute_info)已经出现多多次了,在Class文件、字段表、方法表中都可以携带自己的属性集合,用于描述某些场景专有的信息 ?    与class文件中其他的数据项目要求严格的顺序、长度和内容不同,属性表集合的限制稍微宽松些,不在要求各个属性表具有严格顺序,并且只要不与已有属性名称重复,任何人实现的编译器都可以向属性表中写入自己的属性信息 SourceFile属性 SourceFile属性用于记录生成这个Class文件的源码文件名称 名称 类型 数量 attribute_name_index u2 1 attribute_length u4 1 sourcefile_index u2 1 sourcefile_index是指向常量池中CONSTANT_Utf8_info型常量的索引,常量值是源码文件文件名 ? inner_classes_info结构为: 名称 类型 数量 inner_class_info_index u2 1 outer_class_info_index u2 1 inner_name_index

    1K20

    jvm| class文件认识

    文件结构 class 文件是一组以8位字节位基础单位的二进制流,各个数据项目按照顺序紧凑排列在class文件class 文件格式采用一种类似C语言结构体的伪代码来存储数据,这种伪结构中只有无符号数和表 ,2个字节,4个字节,8个字节的无符号数 无符号可以用来描述数字,索引引用,数量值或按照utf-8编码构成字符串值 表是由多个无符号或者其他表作为数据项构成的复合数据类型,表通常以“_info”结尾 class class 文件的头4个字节称为魔数(Magic Number),他用作确定这个文件是否为一个虚拟机所接受的class文件 ? 常量池 常量池是class文件的资源仓库 常量池主要存放两大类常量,字面量(Literal)和符号引用(Symbolic Reference) 字面量类似Java语言层面的常量概念,如文本字符串,声明为 (class是类还是接口,是否为public类型,是为abstract类型,是否被声明为final) ? 参考学习 垃圾回收器是如何演进的? 垃圾回收算法是如何设计的?

    26110

    Class文件结构介绍

    对于每个java程序员来说class文件应该是每天都会接触的,一个class文件都对应着唯一的一个类或接口的定义信息,但是对应class文件的具体存储结构并不一定很清楚,所以本文就梳理下class文件的结构 Class文件   Class文件是一组8位字节为基础单位的二进制流,各个数据项严格按照顺序紧凑的排列在Class文件中,中间没有添加任何分隔符,整个class文件中存储的内容几乎全部是程序运行的必要数据 为了便于查看class的结构我们通过一个java文件编译出对应的class文件然后通过WinHex工具或者classpy来查看。 ; } } WinHex查看class文件: ? 每个Class文件的头4个字节成为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个能被虚拟机接收的Class文件。所有Class文件,魔数均为0xCAFEBABE。

    45410

    Class文件方法表

    但是作为字节码层面的重载要求要低一些,因为Java虚拟机规范定义了方法的返回值以及受查异常表也属于特征签名的一部分,因此两个仅仅返回值不同的方法在Class文件中也是可以共存的。 没错关于方法体也就是说方法如何执行的就存储在这个方法表的Code属性上,关于Java虚拟机中的属性类型我们在上一节已经列举过了,不清楚的可以看一下上一节的内容 实例分析 public class ClassTest { private int m; private int inc() { return m + 1; } } 下图红色部分是经过Class文件中方法表的区域 通过Ox0002我们知道有该Class文件有两个方法,下面我们来看一下第一个方法,从Java类中命名只有一个方法,为什么到了Class文件会有两个方法,这是因为Java类在编译的时候会自动生成构造方法

    36110

    Class文件结构

    Java虚拟机不和特定的语言绑定,它只与 “Class文件” 这种特定的二进制文件格式所关联。Class文件中包含了 Java虚拟机指令集和符号表以及若干其他辅助信息。 Class文件的结构 ---- Class 文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class文件之中,中间没有任何分隔符,这使得整个 Class文件中存储的内容几乎全部是程序运行的必要数据 魔数与 Class文件的版本 ---- 每一个 Class 文件的前 4个字节称为魔数(Magic),它的唯一作用是确定这个文件是否为一个能被虚拟机接收的 Class文件Class文件。 常量池 ---- 紧接着主次版本号之后的是常量池入口,常量池可以理解为 Class文件之中的资源仓库,它是 Class文件结构中与其他项目关联最多的数据类型,也是占用 Class文件空间最大的数据项目之一

    43520

    class文件与dex文件解析

    目录 前言 一、class文件解析 1-1、class文件基本概念 1-2、生成class文件 1-3、class文件的作用 1-4、class文件的整体结构 1-5、class文件的微观结构 1-6、 一、class文件解析 1-1、class文件基本概念 能够被JVM识别,加载并执行的文件格式,说白了就是一种文件格式,像mp4、doc、txt这种文件格式一样,只不过class文件中存储的是应用程序, 1-4、class文件的整体结构 一种8位字节的二进制流文件 各个数据按顺序紧密的排列,无间隙 每个类或接口都单独占据一个class文件 从整体上看,首先它是一种8位字节的二进制流文件,这一点与大部分文件都一样 1-5、class文件的微观结构 上图中呢就是class文件中的所有字段,下面来具体说说每个字段的主要作用。 2-7、class文件与dex文件对比 本质上它们都是一样的,dex文件是从class文件演变而来的 class文件存在许多冗余信息,dex会去除冗余并整合 从下面这张图就能够很清楚的看出它们的异同了

    71810

    《Java核心技术》 Class文件结构开篇Class文件结构

    想看懂这一串十六进制的字符,就要了解class文件协议。 文件,但是无法运行以后版本的Class文件,即使文件格式并未发生变化 如果使用JDK1.5运行使用JDK1.6编译的Class文件,会报: java.lang.UnsupportedClassVersionError : Bad version number in .class file 就是由于JDK1.6编译的文件版本号超过了JDK1.5虚拟机所接受的范围 Java class文件是二进制文件Class文件结构 ? class文件的结构 简单讲,jvm的class文件是针对jvm的私家定制。只要运行在jvm上byte code,都需要按照class文件format来。否则jvm解析不了。 class文件是一组以八位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有添加任何分隔符,这使得整个class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在

    31730

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 文件存储

      文件存储

      文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。CFS 可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云 CFS 的管理界面简单、易使用,可实现对现有应用的无缝集;按实际用量付费,为您节约成本,简化 IT 运维工作。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注腾讯云开发者

      领取腾讯云代金券