class文件组成
2017-03-05 16:44:58 0 举报
一个Java类文件由四部分构成: 1. 魔数:唯一标识JVM规范版本和实现版本的数字。 2. 版本信息:表明生成此Class文件的JVM版本号及相关信息。 3. 常量池:存放编译器生成的字面量、符号引用等。 4. 访问标志、当前类索引、父类索引与接口索引集合:用于描述当前类的基本信息。 5. 字段表集合:用于描述当前类或接口的声明字段。 6. 方法表集合:用于描述当前类或接口的所有方法。 7. 属性表集合:用于描述某些语义属性,如源文件名、字节码校验和等。
作者其他创作
大纲/内容
Float:类似Integer
max_locals:u2,局部变量表所需要的内存的最小值
inner_class_info_index:u2,指向常量池中的表示内部类Class的索引
num_of_exception:u2,可能抛出异常的种类
SourceFile:记录生成这个Class文件的源码文件,不是必须的
attributes_count:u2用来表中 示该filed自定义的属性数量
minor_version:表示class主版本号,高版本JDK兼容低版本,反之不行。
super_class:父类的全限定名的引用
methods:method_info类型,类似fields
方法参数、局部变量、异常处理变量都会放入方法帧中的局部变量表,这个参数并不是以上数据大小的相加值,因为如果超过了某数据的作用域,那么局部变量表就能重用
LocalVariableTable:该方法帧中的局部变量表与源代码中定义的变量的关系,不是必须的
this_class:本类的全限定名的引用
out_class_info_index:u2,指向常量池中的表示宿主类Class的索引
常量都是一个表,一共有14种,每种表的开始都是一个tag:u1的标志位,用来标识是哪种表,前缀是CONSTANT_,尾是缀_info
major_version:表示class次版本号,高版本JDK兼容低版本,反之不行。
exception_table:
全都是u2类型
constant_pool:cp_info类型
exception_table_length:u2,excetion_table的数量
access_flags:u2和类访问符类似
有start_pc、end_pc、handler_pc、catch_type这四个属性,都是u2。表示当在start行和end行之间有一个catch_type(指向常量池中的Class)的异常,那么就跳转到 handler行进行处理。
code:u1,字节码指令的标识,可以通过查表找到具体指令
介绍
Double:类似Long
feilds:field_info类型
Methodref:(index1:指向声明该方法的类的Class 常量的索引,index2:指向NameAndType的索引)
code_length:u4,字节码指令的数量
Integer:(bytes:u4,储存int值)
字面量:文本字符串、声明为final的常量
InnerClasses:记录内部类和宿主类的关联,内部类会生成一个自己的class文件。
max_stack:u2,该方法帧中的操作数栈的最大深度
符号引用:Class文件是动态链接,其中不会像c++一样保存各种方法和字段的具体内存地址,而是会在类创建的时候根据这些引用解析翻译到具体的内存地址中
以下几个常量种类再加上Utf8这个常量,一般给字面常量使用
access_flags: 访问标志有16个bit来控制某个权限的开关,目前只用了8。
Code:经过编译后的方法体中的代码,以字节码指令的形式存在
attribute:attribute_info类型
Exceptions:方法中throws后面列举的异常
magic:u4,表示该文件是一个class文件
attrbutes_count:标记自定义属性的数量
constant_pool_count:标记常量池中常量的数量,从1计数
Class:(index:u2指向常量池中某个Utf8类型的索引)
fields_count:标记字段的数量
LinNumberTable:java源代码行号与字节码行号之间的对应关系,不是必须的
name_index和descriptor_index这两个都是u2都是索引,指向的是常量池中Fieldref的对应字段
Utf8:(length:u2判断接下来有多少个bytes,bytes:u1储存有length个字符的字符串)
exception_index_table:u2,被抛出异常的引用,指向常量池中的Class
inner_class_access_flags:u2,内部类的访问权限
Long:类似Integer,不过是u8储存
String:同Class
Interface-Methodref:(index1:指向声明该方法的接口的Class 常量的索引,index2:指向NameAndType的索引)
都指向常量池中的某个数据
interfaces:一个有interfaces_count个,接口全限定名的引用
还有更多属性,但是暂时不怎么需要就布列出来了
methods_count:标记方法的数量
Fieldref:(index1:指向声明该字段的类或接口的Class 常量的索引,index2:指向NameAndType的索引)
1.基本数据类型:u1、u2、u3、u4,代表1到4字节,可以用来表示数字、引用、数量值、字符串。2.表是基本数据类型加上表的嵌套, 一个class文件就一个表。名字一般以info结尾。3.class文件是以字节为基础的二进制数据构成,期间没有任何空隙
NameAndType:两个index,分别表示字段名或方法名的索引和字段描述或方法描述的索引,该索引的最终类型都是Utf8
number_of_classes:u2,内部类的数量
interfaces_count:标记接口的数量
attributes:attribute_info类型
class文件
ConstantValue:使用了static的基本常量通过这个赋值,其指向了一个常量池中的基本类型。
0 条评论
下一页