JVM 之 Class文件结构_第1页
JVM 之 Class文件结构_第2页
JVM 之 Class文件结构_第3页
JVM 之 Class文件结构_第4页
JVM 之 Class文件结构_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JVM 之 Class文件结构本文写作目的:1)为了加深自己学习的理解,2)帮助正在学习研究JVM的同仁,3)与任何热爱技术的达人交流经验,提升自己以此为本,文章会尽量写的简洁,尽量保证理解的正确性,如有任何理解不到位或错误的地方,希望朋友们及时指出,严厉拍砖。开始之前我们需要先了解一些基本的概念,这些概念是学习整个JVM原理的基础。1)JVM虚拟机规范主要规范了Class文件结构,虚拟机内存结构,虚拟机加载,解析,执行Class文件的行为方式,以及一系列的字节码指令集。2)Class文件理论上说是一种数据结构,该数据结构有着严格的格式规范,该规范在字节粒度上规定了组成该数据结构的格式标准。)

2、Class文件本质上是一组二进制字节流,是被JVM解析执行的数据源,每个字节都有着不同的含义,可能表示字符,数字,也可能表示执行某种操作的一个字节码指令。)JVM (Java 虚拟机)是解析执行Class文件的核心引擎,是整个Java系统的运行时环境,是跨平台的基石。)我们的Java代码需要被编译器编译成完整,正确的Class文件才能被JVM正确的执行。)编译器并非JVM的一部分,不同的语言可以提供不同的编译器,其作用是将该语言的代码编译为正确的Class文件,如Scala,JRuby等等。)JVM是完全开放的跨平台的,只要你有能力你可以按照JVM虚拟机规范编写自己的编程语言。)JVM 使得J

3、ava的跨平台成为可能,那么Class文件结构规范则使得更多的编程语言运行在JVM上成为可能。既然Class文件是一种数据结构,那么到底是什么样的数据结构呢?通常计算机中的文件都包含元数据和实体数据两部分,元数据用来存储该文件的描述信息,实体数据来存放用于表达文件真实内容的数据。当然Class文件也不例外,我们为了便于理解,也将class文件的结构分为两大部分:元数据和实体数据(注:非规范定义,只是为了方便理解进行的自定义)。元数据:包含了Class文件的魔术数(标识符)和版本信息。实体数据:包含了常量池,字段描述,方法描述,属性描述等用于表述该类行为的具体信息。元数据我们不多赘述对我们后面的

4、分析没多大关系,下面主要分析下实体数据。一,结构概览不管是元数据还是实体数据他们都以字节为单位按顺序紧凑的排列在class文件中,没有任何多余空间。为了描述class文件结构,虚拟机规范定义了u1, u2, u4, u8四种基本数据结构和一种由这四种基本数据结构组成的复杂数据结构-表(通常以info结尾表示),这四种基本数据结构分别表示一个字节,两个字节,四个字节,八个字节。基于此我们便可以清晰的了解class文件结构的总体轮廓了(C语言语法,其中常量表,变量表,方法表,属性表都有一到多个,因此定义为数组),如?123456789101112131415161718class-fileu4ma

5、gic;/魔术数u2minor_version;/小版本号u2major_version;/大版本号u2constant_pool_count;/常量池中常量个数+1cp_infoconstant_poolconstant_pool_count-1;/常量池u2access_flags;/类的访问控制符标识(public,static,final,abstract等)u2this_class;/该类的描述(值为对常量池的引用,引用的值为CONSTANT_Class_info)u2super_class;/父类的描述(值为对常量池的引用,引用的值为CONSTANT_Class_info)u2in

6、terfaces_count;/接口数量u2interfacesinterfaces_count;/接口的描述(每个都是对常量池的引用)u2fields_count;/变量数,包括该类中或接口中类变量和实例变量field_infofieldsfields_count;/变量表集合u2methods_count;/方法数,包括该类中或接口中定义的所有方法method_infomethodsmethods_count;/方法表集合u2attributes_count;/属性数,包括InnerClasses,EnclosingMethod,SourceFile等attribute_infoattri

7、butesattributes_count;/属性表集合注:表本身是一种复杂结构,包含多个字节,Class文件机构中定义了四种表结构,1)常量表2)变量表3)方法表4)属性表。由于每种表都有一到多个,所以在中可以看出他们都是在数组中的。接下来我们按顺序研究下每个部分的具体含义!二,常量池Class文件中的常量池大小(constant_pool_count)由第九,第十两个字节(前八个字节用来描述版本信息)决定,我们知道两个字节最大可以表示65535,这也就表明一个Class文件中最多可以具备65535个常量,包括数值,字符串,类名,方法名,变量名等等。接下来的constant_pool_cou

8、nt个字节就用来描述所有的常量了。为了能表示各种可能类型的值,常量在Class文件中被定义成一种复杂结构:如?1234cp_info/常量表的通用结构,不同类型的常量表以此为基础各不相同u1tag;u1info;可以看出,常量的第一个字节表示了该常量的类型。注:constant_pool_count的值为常量个数+1,并且常量池常量的索引从1开始!下面为各类型的映射表:Constant TypeValueCONSTANT_Class7CONSTANT_Fieldref9CONSTANT_Methodref10CONSTANT_InterfaceMethodref11CONSTANT_Strin

9、g8CONSTANT_Integer3CONSTANT_Float4CONSTANT_Long5CONSTANT_Double6CONSTANT_NameAndType12CONSTANT_Utf81CONSTANT_MethodHandle15CONSTANT_MethodType16CONSTANT_InvokeDynamic18由上表可以看出,目前为止JVM 一共定义了14种类型的常量。每个常量表的第一个字节表明了常量的类型,那么剩余的值则根据类型的不同表明了不同的含义,可能是一个直接值,也可能是一个对另一个常量的引用,那么不同类型的常量表定义如下:?12345CONSTANT_Utf8

10、_info/表示Utf8的常量u1tag;/值为1u2length;u1byteslength;Constant_Utf8_info常量用来表示一个utf8字符串,其长度为可变长度,第一个字节的值固定为1(中Constant_Utf8(1),后面两个字节表示了个字符串的字节长度length(而不是字符串的长度),然后后面紧跟着的length个字节就是字符串的字节码了。该常量被引用的频率颇高,如类名,方法名等常量都引用它。?1234CONSTANT_Class_info/表示类或接口的常量u1tag;/值为7u2name_index;/值为对Constant_Utf8_info常量的引用Cons

11、tant_Class_info常量用来表示一个类或者接口,一共包含三个字节,第一个字节的值固定为 7(中Constant_Class(7),后两个字节的值为对常量池中另一个常量(Constant_Utf8_info)的索引,该Constant_Utf8_info常量的值应为JVM的内部二进制类或接口名(binary class or interface name下文详解)。?1234567891011121314151617CONSTANT_Fieldref_info/表示变量的常量u1tag;/值为9中CONSTANT_Fieldref(9)u2class_index;/值为对Constan

12、t_Class_info常量的索引u2name_and_type_index;/值为CONSTANT_NameAndType_info常量的索引CONSTANT_Methodref_info/表示方法的常量u1tag;/值为10中CONSTANT_Methodref(10)u2class_index;/值为对Constant_Class_info常量的索引u2name_and_type_index;/值为CONSTANT_NameAndType_info常量的索引CONSTANT_InterfaceMethodref_info/表示接口方法的常量u1tag;/值为11中CONSTANT_Int

13、erfaceMethodref(11)u2class_index;/值为对Constant_Class_info常量的索引u2name_and_type_index;/值为CONSTANT_NameAndType_info常量的索引代码五中的三个非常相似的常量结构分别表示了变量,方法,接口方法,其中各个值得含义和大小已在注释中说明。其实很容易理解,比如一个方法,它属于哪个类(class_index),它的名字和类型(name_and_type)。?1234CONSTANT_String_info/表示字符串的常量u1tag;/值为8中CONSTANT_String(8)u2string_ind

14、ex;Constant_String_info表示了一个String类型的常量实例。一共占用三个字节,第一个字节固定为8,后两个字节为对Constant_Utf8_info常量的索引。?123456789101112131415161718192021CONSTANT_Integer_info/表示int类型数值的常量u1tag;/值为3中CONSTANT_Integer(3)u4bytes;CONSTANT_Float_info/表示float类型数值的常量u1tag;/值为4中CONSTANT_Float(4)u4bytes;CONSTANT_Long_info/表示long类型数值的常量

15、u1tag;/值为5中CONSTANT_Long(5)u4high_bytes;u4low_bytes;CONSTANT_Double_info/表示double类型数值的常量u1tag;/值为6中CONSTANT_Double(6)u4high_bytes;u4low_bytes;上面四个常量结构分别表示int, float, long,double类型的常量,比较直观,不多赘述。?12345CONSTANT_NameAndType_info/用来表示变量,方法名字和类型的常量u1tag;/值为12中CONSTANT_NameAndType(12)u2name_index;/值为对Const

16、ant_Utf8_info常量的引用u2descriptor_index;/值为对Constant_Utf8_info常量的引用Constant_NameAndType_info用来表示变量或者方法的名字和类型的常量,该常量不包含该变量或方法的所属类或接口的引用,主要用来被Constant_Method_info,Constant_Field_info等常量使用。该常量一共包含五个字节,第一个固定为12,第二三个的值为对Constant_Utf8_info常量的引用,该Constant_Utf8_info常量的值应为变量或方法的有效的非限定名(unqualified name下文详解),第四五

17、的值为对Constant_Utf8_info常量的引用,该Constant_Utf8_info常量的值应为有效的变量或方法的描述符(field descriptor,method descriptor下文详解)。?12345CONSTANT_MethodHandle_info/用来表示方法句柄的常量u1tag;/值为15中CONSTANT_MethodHandle(15)u1reference_kind;/引用类型,值为0-9,表明了该句柄的字节码行为u2reference_index;/引用索引Constant_MethodHandle_info常量用来表示方法句柄,第一个字节固定为15,第

18、二个字节的值为0-9,分别表明了该句柄的不同字节码行为,其值的描述见,最后两个字节为对常量池中某常量的引用,但具体引用那种常量由reference_kind而定。 a,如果reference_kind的值为1 (REF_getField), 2 (REF_getStatic), 3 (REF_putField), 或 4 (REF_putStatic),那么reference_index的值为对Constant_Fieldref_info常量的引用,表示该句柄用于的变量。 b,如果reference_kind的值为5 (REF_invokeVirtual), 6 (REF_invokeStat

19、ic), 7 (REF_invokeSpecial), or 8 (REF_newInvokeSpecial),那么reference_index的值为对Constant_Methodref_info常量的引用,表示该句柄所用与的方法或构造器。 c,如果reference_kind 的值是9(REF_invokeInterface)时,reference_index的值必须为对Constant_InterfaceMethodref_info常量的引用,表示该句柄所用与的接口方法。 d,如果reference_kind 的值是5 (REF_invokeVirtual), 6 (REF_invok

20、eStatic), 7 (REF_invokeSpecial), or 9 (REF_invokeInterface)时,方法的名字一定不可以为或。 e,如果reference_kind的值是8 (REF_newInvokeSpecial)时,方法的名字必须为。KindDescriptionInterpretation1REF_getFieldgetfield C.f:T2REF_getStaticgetstatic C.f:T3REF_putFieldputfield C.f:T4REF_putStaticputstatic C.f:T5REF_invokeVirtualinvokevirt

21、ual C.m:(A*)T6REF_invokeStaticinvokestatic C.m:(A*)T7REF_invokeSpecialinvokespecial C.m:(A*)T8REF_newInvokeSpecialnew C; dup; invokespecial C.:(A*)void9REF_invokeInterfaceinvokeinterface C.m:(A*)T?1234CONSTANT_MethodType_info/用来表示方法类型的常量u1tag;/值为16,中CONSTANT_MethodType(16)u2descriptor_index;/值为对Cons

22、tant_Utf8_info常量的索引,表示方法的描述符(下文详解)Constant_MethodType_info常量用来表示方法类型的常量,描述很直观,不多赘述。?12345CONSTANT_InvokeDynamic_info/该常量用来指定invokedynamic指令的引导方法。u1tag;/值为18,中CONSTANT_InvokeDynamic(18)u2bootstrap_method_attr_index;/值为对属性表BootstrapMethods的有效引用u2name_and_type_index;/值为对Constant_NameAndType_info常量的引用Co

23、nstant_InvokeDynamic_info常量用来指定invokedynamic指令的引导方法,动态调用名称,调用的参数和返回值hi,以及一些列可选的引导方法使用的叫做静态参数的常量。三,访问标志位Class文件中紧跟在常量池后的访问标志位,一共占用两个字节,也就是十六个bit位,每个bit位标记一种类的访问修饰符,如final,abstract,public等,现在JVM已经使用了其中的八个,其余八个保留位未来使用,并且必须置零。八个标志位映射如下表Flag NameValueInterpretationACC_PUBLIC0x0001Declaredpublic; may be a

24、ccessed from outside its package.ACC_FINAL0x0010Declaredfinal; no subclasses allowed.ACC_SUPER0x0020Treat superclass methods specially when invoked by theinvokespecialinstruction.ACC_INTERFACE0x0200Is an interface, not a class.ACC_ABSTRACT0x0400Declaredabstract; must not be instantiated.ACC_SYNTHETI

25、C0x1000Declared synthetic; not present in the source code.ACC_ANNOTATION0x2000Declared as an annotation type.ACC_ENUM0x4000Declared as anenumtype.各个标志位间有一定的约束条件,如ACC_ANNOTATION置位时,ACC_INTERFACE 必须置位等。四,类/父类/接口的描述Class文件中紧跟在访问标志位后的是this_class, super_class, interface_count, interfaces,分别用来表示该类,该类的直接父类

26、(是直接父类哦),实现的接口数量,以及接口信息等。A,其中this_class用来表示该类的信息,其值为对常量池中Constant_Class_info常量的引用。B,super_class用来表示该类的直接父类父类信息,其值要么是0要么是对常量池中Constant_Class_info常量的引用。但有以下几点需要注意:1)如果其值为对常量池Constant_Class_info 的引用,那么被引用的类(直接父类)的ACC_FINAL访问标志位必须不能被置位。2)如果其值为0,那么该类必须,一定是Object类3)接口的super_class值必须是对常量池Constant_Class_inf

27、o常量的引用,并且该常量表示的是Object类。C,interface_count表明了该类实现接口的数量,而interfaces表,则表明了所有的实现接口。其中每一个interface的值占用两个字节,总共占用interface_count * 2个字节,都是对常量池Constant_Class_info 常量的引用。五,变量表(字段表)接下来紧跟在接口定义后面的是变量个数和变量表。该表结构用来描述类中的某个变量定义,不会同时有两个名字和描述符都相同的变量。变量的结构描述结构如下?1234567field_infou2access_flags;/访问标志位,跟常量池后用来修饰类的access

28、_flag作用和用法一致u2name_index;/变量名索引,对常量池CONSTANT_Utf8_info常量的索引u2descriptor_index;/变量描述符索引,对常量池CONSTANT_Utf8_info常量的索引u2attributes_count;/属性数量attribute_infoattributesattributes_count;/包含的属性上面的结构便是Class文件中用来描述某个变量(实例变量,类变量等)的定义。前三个u2字节分别表明了变量的访问修饰符,名称和描述符(下文详解)。其中access_flag 映射如下表Flag NameValueInterpreta

29、tionACC_PUBLIC0x0001Declaredpublic; may be accessed from outside its package.ACC_PRIVATE0x0002Declaredprivate; usable only within the defining class.ACC_PROTECTED0x0004Declaredprotected; may be accessed within subclasses.ACC_STATIC0x0008Declaredstatic.ACC_FINAL0x0010Declaredfinal; never directly ass

30、igned to after object construction (JLS 17.5).ACC_VOLATILE0x0040Declaredvolatile; cannot be cached.ACC_TRANSIENT0x0080Declaredtransient; not written or read by a persistent object manager.ACC_SYNTHETIC0x1000Declared synthetic; not present in the source code.ACC_ENUM0x4000Declared as an element of an

31、enum.名称和描述符都是对常量池中Constant_Utf8_info常量的索引。以上三个U2可以描述一个没有初始值的变量定义了,如private static int i; 但是如果指定了private static int i = 1;那么则会用到名为ConstantValue的attribute_info结构,下文讲解attribute_info时详解。变量中的属性除了ConstantValue外还可能含有Synthetic,Signature,Deprecated,RuntimeVisibleAnnotations和RuntimeInvisibleAnnotations等属性分别表示

32、该变量是否为编译器合成的,变量的签名,是否为废弃的,运行时可见注解,运行时不可见注解。六,方法表Class文件中跟在变量表后面的是方法个数和方法表,该表结构表示一个方法的定义,其中也会包括实例初始化方法(instance initialization method, ),类和接口初始化方法(class or interface initialization method, )。方法表的描述如下?1234567method_infou2access_flags;u2name_index;u2descriptor_index;u2attributes_count;attribute_infoatt

33、ributesattributes_count;该结构跟变量表的结构几乎完全相同,包括方法的访问标志位,名称索引,描述符索引等。下表为方法的访问标志位映射Flag NameValueInterpretationACC_PUBLIC0x0001Declaredpublic; may be accessed from outside its package.ACC_PRIVATE0x0002Declaredprivate; accessible only within the defining class.ACC_PROTECTED0x0004Declaredprotected; may be a

34、ccessed within subclasses.ACC_STATIC0x0008Declaredstatic.ACC_FINAL0x0010Declaredfinal; must not be overridden (5.4.5).ACC_SYNCHRONIZED0x0020Declaredsynchronized; invocation is wrapped by a monitor use.ACC_BRIDGE0x0040A bridge method, generated by the compiler.ACC_VARARGS0x0080Declared with variable

35、number of arguments.ACC_NATIVE0x0100Declarednative; implemented in a language other than Java.ACC_ABSTRACT0x0400Declaredabstract; no implementation is provided.ACC_STRICT0x0800Declaredstrictfp; floating-point mode is FP-strict.ACC_SYNTHETIC0x1000Declared synthetic; not present in the source code.不同的

36、是,方法中包含的属性种类跟变量中的属性种类有所不同,其中可能包含Code,Exceptions,Synthetic,Signature,Deprecated,RuntimeVisibleAnnotations,RuntimeInvisibleAnnotations,RuntimeVisibleParameterAnnotations,RuntimeInvisibleParameterAnnotations,andAnnotationDefault。其中Code属性中包含了该方法的方法体(下文详解)。七,属性表到目前为止我们已经了解了字段表(变量表),方法表,常量池,访问标志位,类的继承等几乎全

37、部类的信息在Class文件中的表达方式了。但是你肯定发现,在方法表中,我们只了解到了方法的名称,描述符,访问控制等信息,却没有方法体的详细描述。不过我们也提到了,方法的方法体是通过属性表来记录的。属性表的结构将在本小结进行较为详细的讲解。你可能已经发现了,变量表(field_info)方法表(method_info)常量表(cp_info)等结构的顶级结构都是Class文件,换句话说,这些结构都是不可嵌套的。然而你也了解到了,我们接下来讲的属性表结构却是可以嵌套的,它可以存在在变量表,方法表结构之内,同样也可以有类级别的属性表。属性表是一类相当灵活的结构,JVM定义了21种属性定义,每一种属性

38、都有自己的结构和用途,有点类似常量池中的常量定义。21种属性中我们只挑选个别与与我们关系比较密切的讲解,其它属性看官可以用同样的分析方法自行研究了解。?12345attribute_info/属性表的基本结构,不同类型的属性表以此为基础各不相同u2attribute_name_index;u4attribute_length;u1infoattribute_length;以上代码描述了属性表的结构定义,前两个字节是对常量池中Constant_Utf8_info常量的索引,被索引的常量值为该属性的名字。中间四个字节是属性内容的字节长度,算下4个字节能最多表示多大?2的32次方?不是,虚拟机规范中

39、规定一个方法不可超过65535个字节。最后的attribute_length 个字节则是属性的内容,如方法体字节码指令集合。前面说了目前JVM预定义了21种属性,参照AttributeJava SEclassfileConstantValueCodeStackMapTable650.0ExceptionsInnerClasses1.145.3EnclosingMethod5.049.0Synthetic1.145.3Signature5.049.0SourceFileSourceDebugExtension5.049.0L

40、ineNumberTableLocalVariableTableLocalVariableTypeTable5.049.0Deprecated1.145.3RuntimeVisibleAnnotations5.049.0RuntimeInvisibleAnnotations5.049.0RuntimeVisibleParameterAnnotations5.049.0RuntimeInvisibleParameterAnnotations5.049.0AnnotationDefault5.049.0BootstrapMethods751.0上表可以看出每种属

41、性的名字和初始版本信息,Java SE7中新加入了BootstrapMethods属性,invokedynamic指令等实现动态语言的特性。限于篇幅,我们这里只分析Code,ContantValue属性。一,ContantValue属性定义了ContantValue属性表的结构?12345ConstantValue_attributeu2attribute_name_index;u4attribute_length;u2constantvalue_index;可以看出该属性是定长的表结构,总共有8个字节大小。前面讲过了前两部分用来表明属性的名字和大小,ContantValue属性表中的name

42、-index索引的常量值固定为“ContantValue”。另外该属性只会出现在变量表(field_info)中,用来表示该变量的值。constantvalue_index也是对常量池中某常量的索引,其索引的常量类型根据变量的类型不同而不同,如下表Field TypeEntry TypelongCONSTANT_LongfloatCONSTANT_FloatdoubleCONSTANT_Doubleint,short,char,byte,booleanCONSTANT_IntegerStringCONSTANT_String二,Code属性相比ConstantValue属性,Code属性相对复

43、杂些,其结构定义如下?12345678910111213141516Code_attributeu2attribute_name_index;u4attribute_length;u2max_stack;u2max_locals;u4code_length;u1codecode_length;u2exception_table_length;u2start_pc;u2end_pc;u2handler_pc;u2catch_type;exception_tableexception_table_length;u2attributes_count;attribute_infoattributesa

44、ttributes_count;前两部分与ConstantValue属性表一样,表示名字索引和大小,不同的是被索引的名字必须为“Code”。Code属性只可以出现在方法表(method_info)中,但是如果一个方法为abstract或者native的,那么其方法表不可以包含Code属性表。否则必须有且只有一个属性表。 1) max_stack:表明方法执行的任意时刻该方法操作数栈的最大深度。 2) max_locals:表明方法执行的任意时刻该方法的本地变量表中变量的最多个数。 关于操作数栈,本地变量表等运行时内存的相关知识,下篇文章深入分析。 3) code_length:顾名思义,表明了

45、方法体的字节码大小。 4) codecode_length:这里便是所有方法体字节码的真正所在地了!JVM规范对这块有很长篇幅的约束,如长度大于0小于65535等等已超出本文范围,不做深究,感兴趣可以查看/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.9接下来的两个字节exception_table_length,定义了方法中异常表的个数。异常表的结构JVM没有单独定义,而是直接定义在了Code属性表中,每个异常表表示一个异常处理块,从上面代码可以看出,每个异常表有4个U2字节: 1) start_pc:异

46、常处理块的开始字节码索引(codecode_length中)取值范围是0, end_pc). 2) end_pc:异常处理块的结束字节码索引(codecode_length中)取值范围是(start_pc, code_length).这里有个有趣的地方,start_pic被定义为inclusive的,就是可以包含第start_pc个字节码, 而end_pc被定义为exclusive的,是不包含第end_pc个字节码的,这样就有一个问题,如果代码长度为65535,并且end_pc也是65535那么最后一个字节码指令就无法被异常处理块捕获处理。这是JVM设计中的一个BUG,规范中已经指出。(严谨程

47、度可见一斑) 3) handler_pc:异常处理代码的字节码索引(codecode_length中)。 5) catch_type:捕获异常的类型,常量池中constant_class_info常量的索引,如果是0则捕获所有异常。异常表后面是另一个属性表的信息了。在Code属性表中的属性表(可见属性表的灵活性了吧)可以是LineNumberTable,LocalVariableTable,LocalVariableTypeTable,andStackMapTable中的一个或多个,主要提供IDE调试功能用的。这里我们就不再分析。八,定义到此为止我们整个Class文件结构已经分析的差不多了,相

48、信如果你从头认真阅读后会有很大收获的。但是我们上面还有一个问题没有弄明白就是binary class or interface name,unqualified name,descriptor有什么区别和意义。1)binary class or interface name,在Class文件中一个类或接口的名字通常都是全限定名(包名+类名),这就称作binary names。如java.lang.Thread。但是由于当年ASCII中点号(.)常被用来表示某些特用意义,因此Java中用斜杠(/)来代替了它,就变成了java/lang/Thread。这就是binary class。2)unqua

49、lified name,Class文件中变量,方法的名字以非限定名的形式保存的,简单讲就是单纯的变量名或方法名,是不能包含./;等ASCII字符的。但有个例外,前者是实例初始化方法,后者是类初始化方法。3)descriptor,用来描述变量或方法类型的字符串。即用一个或多个简单的字符来表达Java中的不同类型,其对应表如下BaseTypeCharacterTypeInterpretationBbytesigned byteCcharUnicode character code point in the Basic Multilingual Plane, encoded with UTF-16Ddoubledouble-precision floating-point valueFfloatsingle-precision floating-point valueIintintegerJlonglong integerLClassName;referencean instance of classClassNameSshortsigned shortZbooleantrueorfalsereferenceone array dimension对于一个int类型的变量其descriptor就是 I对于一个Object类型的变量其descriptor就是Lj

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论