.class文件转换.java_用Java实现JVM第三章《解析class文件》附「classReader拆解」

9d2316027e5a92da7ea4bd9392708e83.png

案例介绍

按照如下虚拟机规范,本文主要介绍java版本jvm提取class字节码方式。在java中没有无符号类型,例如js中byte取值是0~256、java中是-128 ~ +172,所以在实际处理字节码时[虚拟机规范u1、u2、u4],需要进行转换。

[java虚拟机规范]每个Class文件都是由8字节为单位的字节流组成,所有的16位、32位和64位长度的数据将被构造成2个、4个和8个8字节单位来表示。多字节数据项总是按照 Big-Endian的顺序进行存储。

①Big-Endian 顺序是指按高位字节在地址最低位,最低字节在地址最高位来存储数据,它是 SPARC、PowerPC等处理器的默认多字节存储顺序,而 x86等处理器则是使用了相反的 Little-Endian顺序来存储数据。为了保证 Class 文件在不同硬件上具备同样的含义,因此在 Java 虚拟机规范中是有必要严格规定了数据存储顺序的

ClassFile结构体 u1[1字节=8比特位]、u2[2字节=2×8比特位]、u4[4字节=4×8比特位]

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];

字节码介绍

在JAVA中一共有八种基本数据类型,他们分别是byte、short、int、long、float、double、char、boolean

其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样

byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)

short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)

int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)

long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)

byte序号876543212ⁿ2^72^62^52^42^32^22^12^0值1286432168421+12701111111- 12810000000

二进制求和(127):2^0+2^1+2^2+2^3+2^4+2^5+2^6+2^7 = 2^(n+1) - 1 = 127/** * byte 取值范围 * +127 = [0][1][1][1][1][1][1][1] * -128 = [1][0][0][0][0][0][0][0] * * 有符号 * -120 = [1][1][1][1][1][0][0][0] * 无符号(增位) 136 = 256 - 120 * 136 = [0][0][0][0][0][0][0][0][1][0][0][0][1][0][0][0] * * 输出二进制:new BigInteger("-120
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值