预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共15页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

JavaClass文件结构分析 学习Java虚拟机对于理解AOP,反射,并发同步、垃圾回收、代码优化等方面都会有不少帮助,有时候还是有必要对底层的原理做一下了解。不过看起来确实比较费解。可以一步一步来,能看懂多少是多少。 Java虚拟机可以从class字节码文件、类装载体系结构、对象生命周期、执行引擎、API规范等几个方面来学习。Class文件是java虚拟机的基础,从class文件结构中可以学习到java虚拟机的一些基本原理。 本文主要介绍class文件的设计结构,为后面的话题打下一个基础。(主要参考了深入java虚拟机这本书和网上资料) 1.ClassFile基本定义 Classfile是一个连续的8位字节二进制流,数据项按照顺序存储在class文件中,相邻项没有间隔,占多字节空间的项时,高位在前。 ClassFile文件格式是固定的,按照顺序 名称 长度 描述 备注 majic 4个字节 魔数:0xCAFEBABE Od–x命令可以看到。这样保证了Java虚拟机能很轻松的分辨出Java文件和非Java文件 Minor_version和major_version 分别2字节 主次版本号:Class文件格式一旦发生变化,版本号也会随之变化。 如果class文件版本号超出了处理范围,java虚拟机将不会处理该文件。 Constantpool_count,constanpool 不固定 常量池:包含了文件中类和接口相关的常量。文字字符串、final变量值、类名和方法名的常量。常量池的大小平均占到了整个类大小的60%左右。 入口列表的形式来存储。每个常量池入口都从一个长度为一个字节的标志开始。除了字面常量还可以容纳字段名称、方法名称和类的全限名等。 Access_flags 2字节 访问标志:定义了类或接口 指明了是类还是接口、是抽象还是具体。公共、final等修饰符。 This_class 2字节 本身是一个常量池的索引,指向了常量池中该类全限定名的常量池入口 Super_class 2字节 指向父类全限定名 Interface_count和interfaces 不固定 该类实现的接口数量,interfaces包含了由该类实现的接口的常量池引用。 FiledsCount和fileds 不固定 字段数量和字段的信息表。描述了字段的类型、描述符等。 Methods_count和Mechods 不固定 方法总数和方法本身。使用ASM进行AOP编程,通常是通过调整Method中的指令来实现的。 每一个方法都会有一个Mechod_info表,改表记录了方法的方法名、描述符、返回类型。局部变量表,字节码序列等。 Attributes_count和Attributes 不固定 属性总数和属性本身。写出了 2.CLassFile详细结构 根据如上格式定义成结构体如下 (以下内容参考了文章http://hi.baidu.com/52dege/blog/item/f33a3cf4092491dbf3d3854f.html): ClassFile{ u4magic;//必须为:0xCAFEBABE u2minor_version; u2major_version;//CLASS文件结构主次版本号JAVA2支持45.0-46.0 u2constant_pool_count;//记录常量信息 cp_infoconstant_pool[constant_pool_count-1];//计数从1开始 u2access_flags;//class/interface访问权限 u2this_class;//指向constant_poll中的有效索引值 u2super_class;//0或指向constant_poll中的有效索引值,对于interface必须为非0 u2interfaces_count;//superinterfaces的个数 u2interfaces[interfaces_count];//计数[0,count-1)对应constant_pool中的一个索引值 u2fields_count; field_infofields[fields_count];//主要用于记录class及实例中的变量 u2methods_count; method_infomethods[methods_count]; u2attributes_count; attribute_infoattributes[attributes_count]; } 对于上面的cp_infoconstant_pool[constant_pool_count-1],是一个cp_info结