JVM学习之路

字节码class文件格式(1个字节等于8位,-128~127)

首4字节:魔术Magic ,0xCAFEBABE(1991年由java开发小组关键成员Patrick Naughton确定,有意思的名字,代表Baristas咖啡,为了容易记忆,16进制数据,需要转化为10进制)

第5678字节:56表示次版本号,78表示主版本号。java版本号从45开始,如JDK1.0能执行45.0~45.65535的Class文件。

顺便提一下:虚拟机对于字节码class文件的格式有严格定义,比如class文件中的数据类型包括无字符数和表(表也就是有逻辑关系的无字符数组成的)。

      运行时常量池:

        class文件中的常量池的每一个常量都是一个表,表的类型在不同的JDK版本中不同,JDK1.6中一共有14种(各类型的标志和描述见《深入理解java虚拟机》169页表6-3),

        JDK1.7中新增了3种(CONSTANT_METHODHandle_info,   CONSTANT_MethodType_info , CONSTSNT_InvokeDynamic_info),

        每一种表类型都有各自的结构(各类型的标志和描述见《深入理解java虚拟机》172页表6-6),如CONSTANT_Class_info类型和CONSTANT_UTF8_info类型,结构为:

CONSTANT_Class_info型常量的结构
类型 名称 数量
u1(表示占1个字节的字符数) tag 1
u2(表示占2个字节的字符数) name_index 1

        

CONSYANT_UTF8_info
类型 名称 数量
u1 tag 1
u2 length 1
u1 bytes length

        

        常量池的常量包括:1. java的字面量(包括基础数据类型字面量和字符串引用数据类型字面量)2. 引用(包括方法名、字段名、类or接口的全限定名)。

        对于类或者接口的名称、方法、变量名称这一类的存储于常量池的常量,肯定也是表类型(因为常量池的每一个常量都是表类型,都是_info结尾)。而且是CONSTANT_UTF8_info类型,此类型的长度是u2,也就是2个字节,

        长度最大为65535(64KB),若java中的名称超过了64KB英文字符,将会无法编译。

        

猜你喜欢

转载自www.cnblogs.com/zhushaolong/p/11294854.html