当前位置: 首页 > 后端技术 > Java

jvm类文件结构

时间:2023-04-01 14:23:40 Java

I.实验独立性语言独立性的基础仍然是虚拟机和字节码存储格式。Java语言不与包括Java语言在内的任何编程语言(如:Kotlin、Clojure、Groovy、JRuby、JPhthon、Scale等)绑定,它只与Class文件绑定。二。类文件结构1.8字节为基本单位2.数据类型类型说明无符号数U1、u2、u4、u8分别表示1、2、4、8字节的无符号数。用于按照UTF-8编码描述数字、索引引用、数量值或字符串表“_info”的结尾。Datadescribingacompositestructurewithhierarchicalrelationships.整个Class文件本质上也是一张表3、文件格式类型名称数量u4magic1u2minor_version1u2major_version1u2contsant_pool_count1cp_infocontsant_poolcontsant_pool_count-1u2access_flag1u2this_class1u2super_class1u2interface_count1u2interfacesinterface_countu2fields_count1field_infofieldsfields_countu2methods_count1method_infomethodsmethods_countu2attributes_count1attribute_infoattributesattributes_count3-1魔数(magic)确定这个文件是否能为一个被虚拟机接受的Class文件。值为:0xCAFEBABE3-2次版本号minor-version和主版本号major-version即使文件格式没有改变,虚拟机也必须拒绝执行超过其版本号的Class文件3-3常量池constant_pool1,常量池主要存储:字面量和符号引用2.字面量:接近Java的常量概念,如文本字符串、声明为final的常量值等3.符号引用:3.1、模块导出或打开的包3.2、类andinterfacesFullyqualifiedname3.3,字段名和描述符3.4,方法名和描述符3.5,方法句柄和方法类型3.6,动态调用点和动态常量4,Java中一个方法和字段名的最大长度为64KB3-4access标记access_flags,标识一些类或接口级别的访问信息,包括:该Class是类还是接口;是否定义为公共类;是否定义为抽象类型;如果是类,是否声明为final等3-5类索引(this_class)、父类索引(super_class)和接口索引集合(interfaces)类文件由这3项数据决定类的继承关系。类索引标识类的完全限定名称。父类索引标识此类的父类的完全限定名称。3-6字段表(field_info)集合1.描述接口或类中声明的变量。包括类级变量和实例级变量,但不包括在方法内部声明的局部变量。2.字段修饰符:2.1。字段的范围,public,private,protected等2.2.是实例变量还是类变量(静态)2.3.可变性(最终)2.4。并发可见性(volatile,是否强制从主存读写)2.5.是否可以序列化(transient)2.6。字段数据类型(基本类型、对象、数组等)3.示例intindexOf(char[]source,intsourceOffset,intsourceCount,char[]target,inttargetOffset,inttargetCount,intfromIndex)描述符是:([II[CIII)I3-7方法表(method_info)集合包括:访问标志、名称索引、描述符索引、属性表集合如果父类方法在子类中不被覆盖,则来自父类的方法信息不会出现在方法表集合中。如果两个方法具有相同的名称和签名但返回值不同,它们也可以合法地共存于一个Class文件中。3-8属性表(attribute_info)集合1、代码属性:Java程序方法体中的代码经过Javac编译器处理后,最终成为字节码,存放在Code属性中。2.Exceptions属性:列出方法中可能抛出的checked异常,即方法描述中throws关键字后面列出的异常。3、LineTableNumber属性:描述了Java源代码行号和字节码行号的对应关系。4.LocalVariableTable和LocalVariableTypeTable属性:用于描述栈帧中局部变量表中的变量与Java源代码中定义的变量之间的关系。5、SourceFile和SourceDebugException属性:SourceFile属性记录了生成Class文件的源代码文件名;SourceDebugException属性用于存储额外的代码调试信息。6.ConstantValue属性:通知虚拟机自动给静态变量赋值。7.InnerClasses属性:记录内部类与宿主类的关系。8、Deprecated和Synthetic属性:Deprecated是指某个类、字段或方法已经被程序作者指定为不再推荐,并设置了@deprecated注解;Synthetic的意思是这个字段或者方法不是Java源码直接生成的,而是通过编译器自己添加的。9、StackMapTable属性:取代之前比较消耗性能的基于数据流分析的推导校验器。10.签名属性:记录通用的签名信息。Java语言的泛型使用擦除方式实现的伪泛型,字节码(Code属性)中的所有泛型信息编译(类型变量、参数化类型)在编译后全部擦除。11、BootstrapMethods属性:保存invokedDynamic指令引用的bootstrap方法限定符。12.MethodsParameters属性:记录方法的每个形参的名称和信息。13、Modularity相关属性:支持模块化;Java9-;RuntimeVisibleAnnotations记录在类、字段或方法的声明上在运行时可见的注释。当我们使用反射API获取类、字段或方法上的注解时,返回值就是通过这个属性获取的。