java 字节码 前 8位_Java字节码的基本结构

Class字节码文件有

两种数据

类型

字节数据直接量:基本的数据类型。细分为u1,u2,u4,u8,代表连续的1、2、4、8个字节组成的整体数据。

表(数组):表是由多个基本数据或其它表按既定顺序组成的数据集合。

Java字节码整体结构

2a064ecff2f3ef2620f35d74bf0aeda6.png

public class MyTest1 {

private int a=1;

public int getA() {

return a;

}

public void setA(int a) {

this.a = a;

}

}

上面类的字节码结构分析

9e05d7c71d2fe6d00508b9e7c643f92c.png

Class字节码文件有

两种数据

类型

字节数据直接量:基本的数据类型。细分为u1,u2,u4,u8,代表连续的1、2、4、8个字节组成的整体数据。

表(数组):表是由多个基本数据或其它表按既定顺序组成的数据集合。

Java字节码整体结构

1:魔数,前四个字节

2:版本号,5-8 字节

3:常量池,可以看作是class文件的资源仓库,比如Java类中定义的方法与变量信息都存储在常量池中,常量池主要存储两类常量:字面量与符号引用。字面量如文本字符串,final常量值等,符号引用如类和接口的全局限定名,字段名称和描述符,方法名称和描述符等。

3.1:常量池的总体结构:Java类所对应的常量池主要由常量池败量与常量池数组(常量表)两部分构成。常量池数量紧跟在主版本号后面,占据2个字节;常量池数組则紧 跟在常量池数量之后。常量池数组与一般的数组不同的是,常量池数组中不同的元素的类型、结构都是不同的,长度当然也就不同;但每一种元素的第一个数据都是—个u1类型,该字节是个标志位,占据1个字节,JVM在解析常量池时,会根据这个u1类型获取元索的具体类型,值得注意的是,常量池数组中元索的个数=常量池数-1 (其中0暂时不使用),目的是满足某些常量池索引值的数据在特定情况下需要表达【不引用任何一个常量池】的含义;根本原因在于,索引为0也是一个常量(保留常量),只不过它不位于常量表中,这个常量就对应null值;所以,常量池的索引从1而非0开始。

3.2:JVM规范中,每个变量/字段都有描述信息,描述信息的主要作用是描述字段的数据类型方法的参数列表(包括数量、类型与顺序)与返回值,根据描述符规则,基本数据类型和代表无返回值的void类型都用一个大写字符来表示,

对象类型则使用字符L加对象全限定名来表示。为了压缩字节码文件的体积,对于基本数据类型JVM都只使用一个大写字母来表示;B -byte,C-chat,D-double,F-float,I-int,J-long,S-short,Z-boolean,V-void,L-对象类型,如Ljava/lang/String

3.3:对于数组来说,每个维度使用一个前置的[来表示,如int[]被记录为[i,String[][]表示为[[Ljava/lang/String;

3.4:用描述符描述方法时,按照先参数列表,后返回值的顺序来描述,参数列表按照参数的严格顺序放在一组()内,如:String test(int id,String name)  —— (I,Ljava/lang/String;)Ljava/lang/String;

4:Access_Flag 访问标志

2a3b6310ea5271c9e89b158725729186.png

5:类名

6:父类名

7:接口

u2 interface-count

u2 interface[interface-count]

8:field

U2            fields_count

field_info     fields[fields_count]

cb452ea4ac85cecab72ecb332f8dc81b.png

9:methods

U2 methods_count 方法个数

methods_info   methods(方法表)

用描述符描述方法时,按照

先参数列表,后返回值的顺序来描述。

参数列表按照参数的严格顺序放在一组()之类,如方法 String Test(int id,String name) 的描述符为:(I,Ljava/lang/String)Ljava/lang/String

a2f7dfcf7a642ed8fb574b68152a777c.png

2272e61a94a900b2b299790723aeceea.png

code attribute 保存方法结构

fcafc5f03884f9a981735900f5f5c115.png

4631a645acfc2a934e18fdbcffe6eb9f.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值