class文件字节码常量池

常量池是什么

1,常量池中全是表(一共14种)
2,每个表都是有结构的, 通过第一个字节可以知道是什么表
3,每个表的长度都是可以知道的
3.1,有的表长度固定 比如 CONSTANT_Class_info 表 就是U1(TAG)+U2(一个索引)
3.2,有的表长度可变 比如 CONSTANT_utf8_info 表 但是有字段表明长度(U1(TAG) + (U2)length + length*U1)
4,常量池的长度在最开始就用一个U2标识出来了
5,常量池的起始位置是固定的(在版本号后面)

常量池起始位置固定已知,长度已知,里面的每个表格式和长度都已知
那么整个常量池就是可以解析的

String的最大长度为什么是65534

String类型的常量在class文件的表示是在常量池中
用 CONSTANT_utf8_info 标识的
然后这个表的长度是使用U2标识的,所以长度是2的16次方-1 65535
因为这个javac对字面字符长度做了限制 ((String)constValue).length() < Pool.MAX_STRING_LENGTH
用的是小于,所有String常量最大是65534
汉字和英文所需要的字节不一样,所以如果是汉字(utf-8)的话,远远小于65534
一般一个汉字用utf-8标识占3个字节左右

什么是UTF-8

UTF-8是一种针对Unicode的可变长度字符编码
UTF-8是一种变长、多字节编码方案,从一字节模式,到六字节模式。虽然unicode只到21位,但是查看pcre2的源代码发现,对UTF-8的支持到六字节。
0*******
110***** 10******
1110**** 10****** 10******
11110*** 10****** 10****** 10******
分析一个UTF-8编码的文件
如果是0开头的,就是一字节模式,该模式兼容基本ASCII码,也是128个码位
如果第一字节以110开头,则使用双字节模式,接下来的那个字节以10开头
如果是1110开头则是三字节模式,如果是11110开头则是四字节模式
有多少 * 就有 2的*次方个码位

属性表的理解

属性表有三个元素
1,name_index 两个字节,指向 一个CONSTANT_utf8_info 表明属性表的名字
2,attribute_length 两个字节,表明了该表的长度 有点类似(一个CONSTANT_utf8_info)
3,u1[] attribute_length 个字节 里面放任何你想放的东西 这个和CONSTANT_utf8_info 不一样,CONSTANT_utf8_info 里面放的全是ascii码 标识字符
属性表里面放的东西,可以自己定义他是什么,jvm里面预制了一些属性表
比如 code 他把 u[1]u[2] 定义为 max_stack
code属性表

再比如 LineNumberTable 他把 u[1]u[2] 定义为 line_number_table_length
LineNumberTable 属性表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值