java Class文件结构

java虚拟机规范第二版,Java虚拟机规范第三版(java se 1.7版本),发现java虚拟机规范中java class的文件结构部分并没有太大的变化。

java语言是跨平台的,所谓一次编写,到处运行。之所以是跨平台的,就是java定义了一套与操作系统,硬件无关的字节码格式,这个字节码就是用java class文件来表示的,java class文件内部定义了虚拟机可以识别的字节码格式,这个格式是平台无关性的,在linux系统或者在windows系统上都是一致的。这个就好比html文件,我们定义好规范,这个系统只要去按照规范显示出来里面的内容就好了。好比html就是class文件,浏览器就是虚拟机一样,通过浏览器去执行html的渲染过程,我们无论是用手机,Windows系统,苹果系统上网,显示出来的内容都是一样。 java虚拟机可以从class文件中加载预定义的字节码,也可以从网络,数据库,消息文件中加载字节码。

java class文件结构是基于字节流的,用unicode进行编码。其实想想也可以完全用xml文件表示,只不过用xml表示的字节码文本体积可能会很大,占用空间,同时解析起来比较耗时,而且很容易被人为修改,导致未知错误。下面是class文件的内部结构

ClassFile { 
u4 magic; 
u2 minor_version; 
u2 major_version; 
u2 constant_pool_count; 
cp_info constant_pool[constant_pool_count-1]; 
u2 access_flags; 
u2 this_class; 
u2 super_class; 
u2 interfaces_count; 
u2 interfaces[interfaces_count]; 
u2 fields_count; 
field_info fields[fields_count]; 
u2 methods_count; 
method_info methods[methods_count]; 
u2 attributes_count; 
attribute_info attributes[attributes_count]; 
}
1

U4 代表由无符号四个字节组成

u4 magic :是一个固定的数值,java虚拟机里面称为魔数 ,主要是用来标识是否为java虚拟机所支持的文件结构,目前是0xCAFEBABE

u2 minor_version; u2 major_version; 代表次版本号和主版本号

u2 constant_pool_count; cp_info constant_pool[constant_pool_count-1]; 这里面代表常量池个数以及常量池信息

u2 access_flags : 代表class访问标记,例如:public protected

u2 this_class : 代表这个类的名称 例如 java.lang.Object

u2 super_class : 代表父类名称

u2 interfaces_count; u2 interfaces[interfaces_count]; 实现的接口格式以及接口类名

u2 fields_count; field_info fields[fields_count]; 字段个数以及字段信息

u2 methods_count; method_info methods[methods_count]; 方法个数以及方法信息

u2 attributes_count; attribute_info attributes[attributes_count]; java class文件内部属性信息,和java语言定义的属性没有关系,纯粹就是给java虚拟机用的

以上都是java虚拟机规范中定义的class文件内部结构信息,可以参考 Java虚拟机规范 (Java SE 7版)

每种结构又都定义了自己的结构信息,例如:常量池结构,字段信息,方法信息,类信息,这几种结构之间又都互相引用,下面这幅图简要介绍了java class文件的内部结构信息

其中常量池的里面的信息最为复杂,java虚拟机运行时刻的所有信息都是从常量池来获取的,常量池定义了一下几种结构

Java Class文件结构相关推荐

  1. Java Class 文件结构

    Java 类文件结构是一个二进制字节流,由 Java  虚拟机解释. 编译后的class文件用编辑器16进制打开,类似下图的样子,1个16进制是4位,2个16进制是1个字节. 前几位一般都一样,CA ...

  2. Java类文件结构详解

    概述: Class文件结构是了解虚拟机的重要基础之一,如果想深入的了解虚拟机,Class文件结构是不能不了解的. Class文件是一组以8位字节为基础单位的二进制流,各项数据项目严格按照顺序紧凑地排列 ...

  3. jvm(6)-java类文件结构(字节码文件)

    [0]README 0.1)本文部分文字描述转自 "深入理解jvm",旨在学习类文件结构  的基础知识: 0.2)本文荔枝以及荔枝的分析均为原创: 0.3)下面的截图中有附注t*编 ...

  4. c++byte数组和文件的相互转换_5分钟系列之Java类文件结构(三、字节码指令简介)...

    字节码指令简介1字节码与数据类型2加载和存储指令3运算指令4类型转换指令5对象创建与访问指令6操作数栈管理指令7 控制转移指令8方法调用和返回指令9异常处理指令10同步指令公有设计和私有实现Class ...

  5. java文件解析器_jvm:java类文件结构(字节码文件的解析)

    1.java虚拟机简介 不是只有java编译器才能完成java程序到字节码的编译过程 (2)定义 java二进制字节码的运行环境 (3)好处 一次编写,到处运行的基础 自动内存管理,垃圾回收功能,大大 ...

  6. 实例分析JAVA CLASS的文件结构

    今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下. 学习Java的朋友应该都知道Java从刚开始的时候就打着平台无关性的旗号,说&qu ...

  7. 2.Java中String,StringBuilder以及StringBuffer的关系与区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

  8. Java Class 文件格式及其简单 Hack

    最近由于项目要求,需要对 Java Class 文件进行更改.因此必须先了解 Java Class 文件的结构.下面是对 JVMS(Java Virtual Machine Specification ...

  9. jvm(6)-Class字节码文件结构总结

    [0]README 0.1)本文总结于 Clas字节码文件,旨在理清 Class字节码文件的大体结构: [1]干货开始 对上图的分析(Analysis): A1)offset=0 A1.1)头四个字节 ...

最新文章

  1. jpanel不使用jframe保存的图片为空_使用DataBinding还在为数据处理头疼?这篇文章帮你解决问题
  2. centos7上开启单用户模式
  3. Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...
  4. 支持60+数据传输链路,华为云DRS链路商用大盘点
  5. 19. yum 常用命令《Mr.Robot》
  6. opencv-python中文文档
  7. 微信公众号推送模板消息给用户
  8. Bootstrap实战 - 评论列表
  9. 微信小程序 短信验证 功能的实现(附案例代码/前后端/直接用)
  10. 不重复的三位数python_Python趣味案例之不重复的三位数
  11. xss.haozi.me解题记录
  12. 神奇的二进制转换和运算
  13. 阿里云建站套餐怎么样?具体建站流程
  14. 数字化转型顶层设计怎么做?建筑央企数字化转型给出答案
  15. python邮箱自动发送
  16. Android 10 Settings应用如何去掉一级菜单定时开关机
  17. 习题3-3 出租车计价(15 分)
  18. 暴雪和黑客的战争三:黑客的反击
  19. 2012年10月27日沈阳WebLogicFans论坛User Group线下活动
  20. PDF怎么编辑,PDF怎么裁剪空白区域

热门文章

  1. MATLAB知识点2
  2. IE6-IE9不支持table.innerHTML的解决方法分享
  3. jquery返回顶部
  4. Python 技术篇-系统、环境变量配置后python不生效问题解决方法,python服务命令行重启方法
  5. Yen 的k_shortest paths 算法的C++实现
  6. openmv 飞机巡线
  7. sdut-1117 C语言实验——求绝对值(选择结构)
  8. operator.itermgetter() (Python)
  9. DIP第二章习题解答
  10. alpinestars与丹尼斯_骑行靴|丹尼斯VS A星心得分享,它和普通鞋子不同之处竟在这里!...