类型 | 名称 | 数量 |
u2 | fields_count | 1 |
u2 | fields | fields_count |
字段表:用于描述接口或类中声明的变量,包括类级变量或实例变量,不包局部变量。修饰字段作用域(public,private,protected等)是实例变量还是类变量(static)可变性(final)并发可见性(volatile 是否强制从内存读取)。
字段表的具体结构如下:
类型 | 名称 | 数量 | 类型 | 名称 | 数量 |
u2 | access_flags | 1 | u2 | attributes_count | 1 |
u2 | name_index | 1 | attribute_info | attributes | attributes_count |
u2 | descriptor_index | 1 |
字段修饰符放在 access_flags 项目中,与类中 access_flags 项目非常类似如下:
标志名称 | 标志值 | 含义 | 标志名称 | 标志值 | 含义 |
ACC_PUBLIC | 0x0001 | 字段是否public | ACC_VOLATILE | 0x0040 | 字段是否volatile |
ACC_PRIVATE | 0x0002 | 字段是否private | ACC_TRANSIENT | 0x0080 | 字段是否transient |
ACC_PROTECTED | 0x0004 | 字段是否protected | ACC_SYNTHETIC | 0x1000 | 字段是否由编译器自动产生 |
ACC_STATIC | 0x0008 | 字段是否static | ACC_ENUM | 0x4000 | 字段是否enum |
ACC_FINAL | 0x0010 | 字段是否final |
ACC_PUBLIC,ACC_PROTECTED,ACC_PRIVATE 只能选其一,接口字段必须有ACC_PUBIIC,ACC_STATIC,ACC_FINAL标志,这些都是语言规则所导致的。
全限定名:如"com/bzy/demo" 是这个类的全限定名,紧把类中.替换/而已,为多个全限定名混淆中间加; 符号。
简单名称:没有类型或 参数修饰符的方法或者字段名称。
描述符:描述字段数据类型,方法参数列表(数量,类型,及顺序)返回值。
标识字符 | 含义 | 标识字符 | 含义 |
B | 基本类型 byte | L | 基本类型 long |
C | 基本类型 char | S | 基本类型 short |
D | 基本类型 double | Z | 基本类型 boolean |
F | 基本类型 float | ||
I | 基本类型 int | L | 对象类型,如java/lang/Object |
数组类型:每维度用一个前置[ 符号,如 java.lang.String[][] 二维数组将被记成 "[[Ljava/lang/String;" 整型int[] 记成"[I",用描述符来描述方法时,按先参数列表,后返回值的顺序描述,参数列表按参数顺序放在一组小括号()内。如方法 void inc() 描述符"()V" 方法java.lang.String.toString() 描述为 "()Ljava/lang/String",一个整型数组"int[]"被记录成"[i"。
用描述符来描述方法时,按照先参数列表,后返回值的顺序描述,参数列表按照参数严格顺序放在一组小括号()内,如方法void inc()的描述符为"()v",方法java.lang.String.toString()描述符为"()java/lang/String"。