简单名称:指没有类型和参数修饰的方法或字段的名称,如Test类中inc()方法和m字段的简单名称分别是“inc”和“m”
描述符:作用是描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值。
基本数据类型对应的描述符标志符如表:
标识字符 含义
对于数组类型,每一纬度将使用一个前置的“[”字符来描述。
例:一个定义为“java.lang.String[][]”类型的二维数组,将被记录为:“[[Ljava/lang/String;”。一个整型数组“int[]”将被记录为“[I”。
用描述符来描述方法时,按照先参数列表,后返回值的顺序描述,参数列表按照参数的严格顺序放在一组小括号内“()”。如:
方法:“void methond()”的描述符为“()V”。

方法:“java.lang.String.toString()”的描述符为“()Ljava/lang/String”;
方法:“int indexOf(char[]source,int sourceOffset,int sourceCount,char[]taget,int targetOffset,int targetCount)”的描述符为“([CII[CII)I”。
方法表集合:方法表的结构同字段表一样,包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(descriptor_index)、属性表集合几项(attributes)几项。因为volatile和transient关键字不能修饰方法,所以方法表的访问标志中没有ACC_VOLATILE和ACC_TRANSIENT标志,相对增加了,synchronized、native、strictfp和abstract对应的ACC_SYNCHRONIZED、ACC_NATIVE、ACC_STRICTFP和ACC_ABSTRACT标志。
通过方法表,方法的定义可以通过访问标志、名称索引、描述符索引表达清楚,但不能描述方法里的代码。而方法里的Java代码,经过编译器编译成字节码指令后,存放在方法表结构的属性表集合(attributes)中一个名为“Code”的属性里面。属性表集合将在下文描述。
属性表集合:属性表(attribute_info)在字段表与方法表的结构中已经出现过。与Class文件的其他数据部分严格的顺序、长度等要求不同,属性表不再要求严格顺序。如表:只列举Code、ConstantValue与Exceptions属性,其他省略。
属性名称 使用位置 含义
对于每个属性,他的名称需要从常量池中引用一个CONSTANT_Utf8_info类型的常量来表示,而属性值的结构是可以完全自定义的。只需要一个u4长度属性说明属性值所占位数。
类型 名称 数量
Java方法体中的代码经过javac编译器处理后,最终变成“字节码指令”存储在Code属性内。Code属性出现在方法表的属性集合之中,但并非所有的方法表都必须存在这个属性,譬如接口或者抽象类中的方法就不存在Code属性。Code属性表的结构:如表
类型 名称 数量
attribute_name_index:是一项指向CONSTANT_Utf8_info型常量的索引,常量值固定为“Code”,他代表了该属性的属性名称。
attribute_length:指示了属性值的长度。
max_stack:代表了操作数栈(Operand Stacks)深度的最大值。double转换为string在方式执行的任意时刻,操作栈都不会超过这个深度。虚拟机运行的时候需要根据这个值来分配栈帧中的操作栈深度。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-62811-3.html
谁也不会像喝可乐一样和它
看好你了
只有一计能救中国
说的再有道理也是放屁