
 而这每一种类型都有自己的结构,具体如下:
而这每一种类型都有自己的结构,具体如下:
 4.访问标志(access_flags):常量池之后,紧接着的两个字节代表访问标志,这个标志用于识别一些类或者接口层次的访问信息(比如这个class是否是public是否是final等等),具体如下:
4.访问标志(access_flags):常量池之后,紧接着的两个字节代表访问标志,这个标志用于识别一些类或者接口层次的访问信息(比如这个class是否是public是否是final等等),具体如下: 5.类索引,父类索引,接口索引:类索引和父类索引都是一个u2类型的数据,而接口索引集合时一组u2类型的数据的集合,class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名(除了kava.lang.Object以外所有类的父类索引均不为0)。接口索引集合用来描述这个类实现了哪些接口。    类索引和父类索引用两个u2类型的索引值表示,它们各自指向一个类型为CONSTANT_Class_info的类描述符常量,通过CONSTANT_Class_info类型的常量中的索引值可以找到定义在CONSTANT_Utf8_info类型的常量中的全限定名字符串。6.字段表集合:字段表集合用于描述接口或者类中声明的变量。字段包括了类级变量或者实例级变量,但是不包括方法内部声明的变量。其结构如下:
5.类索引,父类索引,接口索引:类索引和父类索引都是一个u2类型的数据,而接口索引集合时一组u2类型的数据的集合,class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名(除了kava.lang.Object以外所有类的父类索引均不为0)。接口索引集合用来描述这个类实现了哪些接口。    类索引和父类索引用两个u2类型的索引值表示,它们各自指向一个类型为CONSTANT_Class_info的类描述符常量,通过CONSTANT_Class_info类型的常量中的索引值可以找到定义在CONSTANT_Utf8_info类型的常量中的全限定名字符串。6.字段表集合:字段表集合用于描述接口或者类中声明的变量。字段包括了类级变量或者实例级变量,但是不包括方法内部声明的变量。其结构如下: 首先两个字节是访问符,这跟类中的access_flags非常类似,都是u2数据类型,其中可以设置的标志位的含义如下:
首先两个字节是访问符,这跟类中的access_flags非常类似,都是u2数据类型,其中可以设置的标志位的含义如下: 其次是name_index,这是一个指向常量池的引用,代表字段的简单名称(指没有类型和参数修饰的方法或者字段名称);紧接着两个字节是descriptor_index,字段方法描述符。描述符的作用是用来描述字段的数据类型、方法的参数列表(包括数量,类型以及顺序)和返回值。根据规则,基本数据类型及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符L加对象的全限定名来表示。
其次是name_index,这是一个指向常量池的引用,代表字段的简单名称(指没有类型和参数修饰的方法或者字段名称);紧接着两个字节是descriptor_index,字段方法描述符。描述符的作用是用来描述字段的数据类型、方法的参数列表(包括数量,类型以及顺序)和返回值。根据规则,基本数据类型及代表无返回值的void类型都用一个大写字符来表示,而对象类型则用字符L加对象的全限定名来表示。 对于数组类型,每一维度会使用‘[’字符来表示,比如定义java.lang.String[][]类型的二维数组,将被记录为[[Ljava/lang/String,而整型数组则标记为[I。用描述符来描述方法时,按照县参数列表,后返回值的顺序,参数列表按照参数的严格顺序放在一组小括号”()“之内。比如void func(),描述符为()V,void foo(int[] a,cha b),描述为([IC)V.描述符之后是属性表集合(attributes,当然之前是属性表计数器),它用于存储一些额外的信息。7.方法表集合:内容跟属性表集合基本一致,下面是其结构:
对于数组类型,每一维度会使用‘[’字符来表示,比如定义java.lang.String[][]类型的二维数组,将被记录为[[Ljava/lang/String,而整型数组则标记为[I。用描述符来描述方法时,按照县参数列表,后返回值的顺序,参数列表按照参数的严格顺序放在一组小括号”()“之内。比如void func(),描述符为()V,void foo(int[] a,cha b),描述为([IC)V.描述符之后是属性表集合(attributes,当然之前是属性表计数器),它用于存储一些额外的信息。7.方法表集合:内容跟属性表集合基本一致,下面是其结构: 但是access_flags访问标志与字段表是有区别的:
但是access_flags访问标志与字段表是有区别的: 另外,方法里的java代码,经过javac编译器编译成字节码指令后,将存放在方法的属性表集合(attributes)中的一个名为code的属性里面.8.属性表集合:在class文件、字段表、方法表中都可以携带字节的属性表集合,用于描述某些场景专有的信息。属性表中的数据项目不需要有严格的顺序,java虚拟机在运行时会自动的忽略掉不认识的属性,其中系统预定义了9种虚拟机应该识别的属性,如下:
另外,方法里的java代码,经过javac编译器编译成字节码指令后,将存放在方法的属性表集合(attributes)中的一个名为code的属性里面.8.属性表集合:在class文件、字段表、方法表中都可以携带字节的属性表集合,用于描述某些场景专有的信息。属性表中的数据项目不需要有严格的顺序,java虚拟机在运行时会自动的忽略掉不认识的属性,其中系统预定义了9种虚拟机应该识别的属性,如下: 每一种属性的名称都是引用的常量池中的常量,属性值的结构可以自定义,但是需要符合下面的结构:
每一种属性的名称都是引用的常量池中的常量,属性值的结构可以自定义,但是需要符合下面的结构: 重点介绍下Code属性。Code属性:java程序方法体里面的代码经过javac编译器处理后,最终变为字节码指令存储在code属性中,code属性出现在方法表的属性集合中,并非所有方法表都必须有code属性,比如抽象方法,code属性结构如下:
重点介绍下Code属性。Code属性:java程序方法体里面的代码经过javac编译器处理后,最终变为字节码指令存储在code属性中,code属性出现在方法表的属性集合中,并非所有方法表都必须有code属性,比如抽象方法,code属性结构如下: 首先attribute_name_index是一项指向常量池的引用(CONSTANT_Utf8_info),值为Code,它代表属性名称;attribute_length代表属性值的长度;max_stack代表操作数栈的最大深度,在方法执行的任意时刻,操作数栈都不会超过这个深度,虚拟机运行的时候将根据这个值来分配栈帧中的操作数栈深度。紧接着max_locals代表局部变量表所需的存储空间。这里需要注意的是,max_locals的单位是slot,slot即槽,是虚拟机为局部变量分配内存所使用的最小单位。基本数据类型除了double和long都占用1slot,double和long占用2slot,另外reference和returnAddress占1slot;code_length和code用来存储java源程序编译后生成的字节码指令。
首先attribute_name_index是一项指向常量池的引用(CONSTANT_Utf8_info),值为Code,它代表属性名称;attribute_length代表属性值的长度;max_stack代表操作数栈的最大深度,在方法执行的任意时刻,操作数栈都不会超过这个深度,虚拟机运行的时候将根据这个值来分配栈帧中的操作数栈深度。紧接着max_locals代表局部变量表所需的存储空间。这里需要注意的是,max_locals的单位是slot,slot即槽,是虚拟机为局部变量分配内存所使用的最小单位。基本数据类型除了double和long都占用1slot,double和long占用2slot,另外reference和returnAddress占1slot;code_length和code用来存储java源程序编译后生成的字节码指令。新闻热点
疑难解答