JVM学习之字节码解析

进制转换

这个是必须要会的,会一点点就行,就是什么逢2进1,逢16进1。不难,不过解析的时候要注意都是16进制,看到10之类的,并不是10而是16

大小端转换

大小端百度百科解释:

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

个人解释:大小端其实就是两种存储方式,我们java默认是大端存储的,而有一些单片机还有计算机都是小端存储的,而如果我们要做物联网,那么硬件工程师铜火锅网络传输过来的数据是小端存储的,那么你用大端读出来的数据肯定是不对的嘛,因为大小端是相反的。所以我们肯定是需要转换一下。转换方法百度一大堆,就不贴了。

图片解释:0x11223344:这是16进制,11是高位,不是数字大是高位,从左往右的
在这里插入图片描述

需要的工具

ultraedit:查看class字节码工具
jclassjib:idea的插件,可以对照看自己解析是否正确
jvm虚拟机规范:一本书,需要查看对应的解析信息,最好用工具看

熟悉解析字节码文件的组成!!!!!!

其实解析字节码就想摩斯密码一样,有一个对应的密码本。对照着就可以解析了。具体可以看书《JVM虚拟机规范》

字节码文件组成图:
u1的意思是: 占1个字节 (16进制的 01
这种算一个)
u2的意思是: 占2个字节
u4的意思是: 占4个字节
!的意思是:不确定,看动态生成的

这些组成的图又有对应的属性图:每个属性占多少字节都有标记的。

魔数其实就是ca fe ba be 这四个字节数,jvm中就是这么规定的,记住就好了。

	为什么会有魔数?魔数有什么用?
	其实就是JVM判断是不是一个合格的class文件,如果是就继续往下面读。

次版本号和主版本号是指java版本的版本号,看图:

在这里插入图片描述

constant pool常量池图,constant_pool_count是常量池大小,也这个类有多少个常量池。

在这里插入图片描述
常量池选项属性图:
在这里插入图片描述

字段描述符图

在这里插入图片描述

类和属性访问修饰符图,这个数可以相加,比如0x0009就是public static

在这里插入图片描述

下面是一些解析的时候一些属性集合

field_info

field_info {
	u2 access_flags;
	u2 name_index;
	u2 descriptor_index;
	u2 attributes_count;
	attribute_info attributes[attributes_count];
}

method_info

method_info {
	u2 access_flags;
	u2 name_index;
	u2 descriptor_index;
	u2 attributes_count;
	attribute_info attributes[attributes_count];
	}

attribute_info

attribute_info {
	u2 attribute_name_index;
	u4 attribute_length;
	u1 info[attribute_length];
	}

Code_attribute

Code_attribute {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 max_stack;
	u2 max_locals;
	u4 code_length;
	u1 code[code_length];
	u2 exception_table_length;
		{  u2 start_pc;
		u2 end_pc;
		u2 handler_pc;
		u2 catch_type;
		} exception_table[exception_table_length];
	u2 attributes_count;
	attribute_info attributes[attributes_count];
	}

LineNumberTable_attribute

LineNumberTable_attribute {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 line_number_table_length;
	{  u2 start_pc;
	u2 line_number;
	} line_number_table[line_number_table_length];
	}

LocalVariableTable

LocalVariableTable_attribute {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 local_variable_table_length;
	{   u2 start_pc;
		u2 length;
		u2 name_index;
		u2 descriptor_index;
		u2 index;
	} local_variable_table[local_variable_table_length];
}

SourceFile_attribute

SourceFile_attribute {
	u2 attribute_name_index;
	u4 attribute_length;
	u2 sourcefile_index;
	}

Java虚拟机规范pdf带目录地址

Java虚拟机规范pdf带目录

猜你喜欢

转载自blog.csdn.net/weixin_42812986/article/details/107854424