class文件“基本类型”
类 型
描 述
u1
1个字节,无符号类型
u2
2个字节,无符号类型
u4
4个字节,无符号类型
u8
8个字节,无符号类型
? ? ? 可变长度的ClassFile表中的项,按照它们在class文件中出现的顺序列出了主要部分。ClassFile表的格式
类?型
名?称
数?量
u4
magic
1
u2
minor_version
1
u2
major_version
1
u2
constant_pool_count
1
cp_info
constant_pool
constant_pool_count-1
u2
access_flags
1
u2
this_class
1
u2
super_class
1
u2
interfaces_count
1
u2
interfaces
interfaces_count
u2
fields_count
1
field_info
fields
fields_count
u2
methods_count
1
method_info
methods
methods_count
u2
attributes_count
1
attribute_info
attributes
attributes_count
? 1)magic(魔数) ? ? 每个Java class文件的前4个字节被称为它的魔数(magic number):0xCAFEBABE。魔数的作用在于,可以轻松地分辨出Java class文件和非Java class文件。常量池标志
入 口 类 型
标 志 值
描 述
CONSTANT_Utf8
1
UTF-8编码的Unicode字符串
CONSTANT_Integer
3
int类型字面值
CONSTANT_Float
4
float类型字面值
CONSTANT_Long
5
long类型字面值
CONSTANT_Double
6
double类型字面值
CONSTANT_Class
7
对一个类或接口的符号引用
CONSTANT_String
8
String类型字面值
CONSTANT_Fieldref
9
对一个字段的符号引用
CONSTANT_Methodref
10
对一个类中声明的方法的符号引用
CONSTANT_InterfaceMethodref
11
对一个接口中声明的方法的符号引用
CONSTANT_NameAndType
12
对一个字段或方法的部分符号引用
? ? ? 除了字面常量(或者说直接量)值以外,常量池还可以容纳下面几种符号引用:access_flags项的标志位
标?志?名
值
设置后的含义
设?置?者
ACC_PUBLIC
0x0001
public类型
类和接口
ACC_FINAL
0x0010
类为final类型
只有类
ACC_SUPER
0x0020
使用新型的invokespecial语义
类和接口
ACC_INTERFACE
0x0200
接口类型,不是类类型
所有的接口,没有类
ACC_ABSTRACT
0x0400
abstract类型
所有的接口,部分类
? ? 在access_flags中所有未使用的位都必须由编译器置0,而且Java虚拟机必须忽略它。 ? 5)this_class ? ? 接下来的两个字节为this_class项,它是一个对常量池的索引。在this_class位置的常量池入口必须为CONSTANT_Class_info表。该表由两个部分组成——标签和name_index。标签部分是一个具有CONSTANT_Class值的常量,在name_index位置的常量池入口为一个包含了类或接口全限定名的CONSTANT_Utf8_info表。
基本类型终结符
终?结?符
类?型
B
byte
C
char
D
double
F
float
I
int
J
long
S
short
Z
boolean
字段描述符示例
描 述 符
字 段 声 明
I
int i;
[[J
long[][] windingRoad;
[Ljava/lang/Object;
java.lang.Object[] stuff;
Ljava/util/Hashtable;
java.util.Hashtable ht;
[[[Z
boolean[][][] isReady;
?方法描述符示例
描?述?符
方?法?声?明
()I
int getSize();
()Ljava/lang/String;
String toString();
([Ljava/lang/String;)V
void main(String[] args);
()V
void wait();
(JI)V
void wait(long timeout, int nanos);
(ZILjava/lang/String;II)Z
boolean regionMatches(boolean ignoreCase, int toOffset, String other, int offset, int len);
([BII)I
int read(byte[] b, int off, int len);
cp_info表的通常形式
类?型
名?称
数?量
描?述
u1
tag
1
表的类型和格式
u1
info
根据tag值决定
?
CONSTANT_Utf8_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Utf8(1)
u2
length
1
bytes项的长度(字节数)
u1
bytes
length
按照变体UTF-8格式存储的字符串中的字符
CONSTANT_Integer_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Integer(3)
u4
bytes
1
按照高位在前的格式存储int类型值
CONSTANT_Float_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Float(4)
u4
bytes
1
按照高位在前的格式存储float类型值
CONSTANT_Long_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Long(5)
u8
bytes
1
按照高位在前的格式存储long类型值
CONSTANT_Double_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Double(6)
u8
bytes
1
按照高位在前的格式存储double类型值
CONSTANT_Class_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Class(7)
u2
name_index
1
包含类或者接口全限定名的CONSTANT_Utf8_info表的索引
CONSTANT_String_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_String(8)
u2
string_index
1
包含文字字符串值的CONSTANT_Utf8_info表的索引
CONSTANT_Fieldref_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Fieldref(9)
u2
class_index
1
声明被引用字段的类或者接口的CONSTANT_Class_info入口的索引
u2
name_and_type_index
1
提供了CONSTANT_NameAndType_info入口的索引,该入口提供了字段的简单名称以及描述符
CONSTANT_Methodref_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_Methodref(10)
u2
class_index
1
声明被引用方法的类的CONSTANT_Class_info入口的索引
u2
name_and_type_index
1
提供了CONSTANT_NameAndType_info入口的索引,该入口提供了方法的简单名称以及描述符
CONSTANT_InterfaceMethodref_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_InterfaceMethodref(11)
u2
class_index
1
声明被引用方法的接口的CONSTANT_Class_info入口的索引
u2
name_and_type_index
1
提供了CONSTANT_NameAndType_info入口的索引,该入口提供了方法的简单名称以及描述符
CONSTANT_NameAndType_info表的格式
类?型
名?称
数?量
描?述
u1
tag
1
值为CONSTANT_NameAndType(12)
u2
name_index
1
给出了CONSTANT_Utf8_info入口的索引,该入口给出了字段或者方法的名称
u2
descriptor_index
1
提供了CONSTANT_Utf8_info入口的索引,该入口提供了字段或者方法的描述符
? 字段 ? ? 在类或者接口中声明的每一个字段(类变量或者实例变量)都由class文件中的一个名为field_info的可变长度的表进行描述。field_info表的格式
类?型
名?称
数?量
描?述
u2
access_flags
1
见下方的表
u2
name_index
1
提供了给出字段简单名称(不是全限定名)的CONSTANT_Utf8_info入口的索引
u2
descriptor_index
1
提供了给出字段描述符的CONSTANT_Utf8_info入口的索引
u2
atrributes_count
1
attributes_count指出列表中attribute_info表的数量
attribute_info
atrributes
atrributes_count
由多个attribute_info表组成的列表
field_info表中access_flags项的标志
标?志?名?称
值
设?定?含?义
设?定?者
ACC_PUBLIC
0x0001
字段设为public
类和接口
ACC_PRIVATE
0x0002
字段设为private
只有类
ACC_PROTECTED
0x0004
字段设为protected
只有类
ACC_STATIC
0x0008
字段设为static
类和接口
ACC_FINAL
0x0010
字段设为final
类和接口
ACC_VOLATILE
0x0040
字段设为volatile
只有类
ACC_TRANSIENT
0x0080
字段设为transient
只有类
? ? ? 类(不包括接口)中声明的字段,只能拥有ACC_PUBLIC、ACC_PRIVATE、ACC_PROTECTED这三个标志中的一个。ACC_FINAL和ACC_VOLATILE不能同时设置。所有接口中声明的字段必须有且只能有ACC_PUBLIC、ACC_STATIC和ACC_FINAL这三种标志。 ? 方法 ? ? 在class文件中,每个在类和接口中声明的方法,或者由编译器产生的方法,都由一个可变长度的method_info表来描述。method_info表的格式
类?型
名?称
数?量
描?述
u2
access_flags
1
见下方的表
u2
name_index
1
提供了给出方法简单名称(不是全限定名)的CONSTANT_Utf8_info入口的索引
u2
descriptor_index
1
提供了给出方法描述符的CONSTANT_Utf8_info入口的索引
u2
atrributes_count
1
attributes_count指出列表中attribute_info表的数量
attribute_info
atrributes
atrributes_count
由多个attribute_info表组成的列表
method_info表中access_flags项的标志
标?志?名?称
值
设?定?含?义
设?定?者
ACC_PUBLIC
0x0001
方法设为public
类和所有的接口方法
ACC_PRIVATE
0x0002
方法设为private
只有类
ACC_PROTECTED
0x0004
方法设为protected
只有类
ACC_STATIC
0x0008
方法设为static
只有类
ACC_FINAL
0x0010
方法设为final
只有类
ACC_SYNCHRONIZED
0x0020
方法设为synchronized
只有类
ACC_NATIVE
0x0100
方法设为native
只有类
ACC_ABSTRACT
0x0400
方法设为abstract
类和所有的接口方法
ACC_STRICT
0x0800
方法设为strictFP
类和接口的<clinit>方法
由规范定义的attribute_info表的类型
名?称
使?用?者
描?述
Code
method_info
方法的字节码和其他数据
ConstantValue
field_info
final变量的值
Deprecated
field_info、method_info
字段或者方法被禁用的指示符
Exceptions
method_info
方法可能抛出的可被检测的异常
InnerClasses
ClassFile
内部、外部类的列表
LineNumberTable
Code_attribute
方法的行号与字节码的映射
LocalVariableTable
Code_attribute
方法的局部变量的描述
SourceFile
ClassFile
源文件名
Synthetic
field_info、method_info
编译器产生的字段或者方法的指示符
attribute_info表的格式
类?型
名?称
数?量
描?述
u2
attribute_name_index
1
给出了包含属性名称的CONSTANT_Utf8入口的常量池中的索引
u4
attribute_length
1
给出了属性数据的长度(以字节计)
u1
info
attribute_length
包含属性数据